summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.iOS/Renderers/DatePickerRenderer.cs122
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