diff options
Diffstat (limited to 'Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs new file mode 100644 index 00000000..fd2b1549 --- /dev/null +++ b/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs @@ -0,0 +1,122 @@ +using System; +using System.Drawing; +using System.ComponentModel; +#if __UNIFIED__ +using UIKit; +using Foundation; +#else +using MonoTouch.UIKit; +using MonoTouch.Foundation; +#endif +#if __UNIFIED__ +using RectangleF = CoreGraphics.CGRect; +using SizeF = CoreGraphics.CGSize; +using PointF = CoreGraphics.CGPoint; + +#else +using nfloat=System.Single; +using nint=System.Int32; +using nuint=System.UInt32; +#endif + +namespace Xamarin.Forms.Platform.iOS +{ + internal class NoCaretField : UITextField + { + public NoCaretField() : base(new RectangleF()) + { + } + + public override RectangleF GetCaretRectForPosition(UITextPosition position) + { + return new RectangleF(); + } + } + + public class DatePickerRenderer : ViewRenderer<DatePicker, UITextField> + { + UIDatePicker _picker; + + protected override void OnElementChanged(ElementChangedEventArgs<DatePicker> e) + { + base.OnElementChanged(e); + + if (e.OldElement == null) + { + var entry = new NoCaretField { BorderStyle = UITextBorderStyle.RoundedRect }; + + entry.Started += OnStarted; + entry.Ended += OnEnded; + + _picker = new UIDatePicker { Mode = UIDatePickerMode.Date, TimeZone = new NSTimeZone("UTC") }; + + _picker.ValueChanged += HandleValueChanged; + + var width = UIScreen.MainScreen.Bounds.Width; + var toolbar = new UIToolbar(new RectangleF(0, 0, width, 44)) { BarStyle = UIBarStyle.Default, Translucent = true }; + var spacer = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace); + var doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done, (o, a) => entry.ResignFirstResponder()); + + toolbar.SetItems(new[] { spacer, doneButton }, false); + + entry.InputView = _picker; + entry.InputAccessoryView = toolbar; + + SetNativeControl(entry); + } + + if (e.NewElement != null) + { + UpdateDateFromModel(false); + UpdateMaximumDate(); + UpdateMinimumDate(); + } + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == DatePicker.DateProperty.PropertyName || e.PropertyName == DatePicker.FormatProperty.PropertyName) + UpdateDateFromModel(true); + else if (e.PropertyName == DatePicker.MinimumDateProperty.PropertyName) + UpdateMinimumDate(); + else if (e.PropertyName == DatePicker.MaximumDateProperty.PropertyName) + UpdateMaximumDate(); + } + + void HandleValueChanged(object sender, EventArgs e) + { + if (Element != null) + ((IElementController)Element).SetValueFromRenderer(DatePicker.DateProperty, _picker.Date.ToDateTime().Date); + } + + void OnEnded(object sender, EventArgs eventArgs) + { + ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, false); + } + + void OnStarted(object sender, EventArgs eventArgs) + { + ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); + } + + void UpdateDateFromModel(bool animate) + { + if (_picker.Date.ToDateTime().Date != Element.Date.Date) + _picker.SetDate(Element.Date.ToNSDate(), animate); + + Control.Text = Element.Date.ToString(Element.Format); + } + + void UpdateMaximumDate() + { + _picker.MaximumDate = Element.MaximumDate.ToNSDate(); + } + + void UpdateMinimumDate() + { + _picker.MinimumDate = Element.MinimumDate.ToNSDate(); + } + } +}
\ No newline at end of file |