diff options
Diffstat (limited to 'Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs')
-rw-r--r-- | Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs new file mode 100644 index 00000000..4d5a3f99 --- /dev/null +++ b/Xamarin.Forms.Platform.iOS/Renderers/EditorRenderer.cs @@ -0,0 +1,159 @@ +using System; +using System.Drawing; +using System.ComponentModel; +#if __UNIFIED__ +using UIKit; +#else +using MonoTouch.UIKit; +#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 +{ + public class EditorRenderer : ViewRenderer<Editor, UITextView> + { + UIToolbar _accessoryView; + + public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint) + { + if (!Forms.IsiOS7OrNewer) + { + // Avoid crash iOS 6. iOS 6, I hate you. Why you no like Infinite size? + return base.GetDesiredSize(Math.Min(widthConstraint, 2000), Math.Min(heightConstraint, 2000)); + } + return base.GetDesiredSize(widthConstraint, heightConstraint); + } + + protected override void Dispose(bool disposing) + { + if (disposing) + { + Control.Changed -= HandleChanged; + Control.Started -= OnStarted; + Control.Ended -= OnEnded; + } + + base.Dispose(disposing); + } + + protected override void OnElementChanged(ElementChangedEventArgs<Editor> e) + { + base.OnElementChanged(e); + + if (Control == null) + { + SetNativeControl(new UITextView(RectangleF.Empty)); + + if (Device.Idiom == TargetIdiom.Phone) + { + // iPhone does not have a dismiss keyboard button + var keyboardWidth = UIScreen.MainScreen.Bounds.Width; + _accessoryView = new UIToolbar(new RectangleF(0, 0, keyboardWidth, 44)) { BarStyle = UIBarStyle.Default, Translucent = true }; + + var spacer = new UIBarButtonItem(UIBarButtonSystemItem.FlexibleSpace); + var doneButton = new UIBarButtonItem(UIBarButtonSystemItem.Done, (o, a) => + { + Control.ResignFirstResponder(); + Element.SendCompleted(); + }); + _accessoryView.SetItems(new[] { spacer, doneButton }, false); + Control.InputAccessoryView = _accessoryView; + } + + Control.Changed += HandleChanged; + Control.Started += OnStarted; + Control.Ended += OnEnded; + } + + if (e.NewElement != null) + { + UpdateText(); + UpdateFont(); + UpdateTextColor(); + UpdateKeyboard(); + UpdateEditable(); + } + } + + protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e) + { + base.OnElementPropertyChanged(sender, e); + + if (e.PropertyName == Editor.TextProperty.PropertyName) + UpdateText(); + else if (e.PropertyName == Xamarin.Forms.InputView.KeyboardProperty.PropertyName) + UpdateKeyboard(); + else if (e.PropertyName == VisualElement.IsEnabledProperty.PropertyName) + UpdateEditable(); + else if (e.PropertyName == Editor.TextColorProperty.PropertyName) + UpdateTextColor(); + else if (e.PropertyName == Editor.FontAttributesProperty.PropertyName) + UpdateFont(); + else if (e.PropertyName == Editor.FontFamilyProperty.PropertyName) + UpdateFont(); + else if (e.PropertyName == Editor.FontSizeProperty.PropertyName) + UpdateFont(); + } + + void HandleChanged(object sender, EventArgs e) + { + ((IElementController)Element).SetValueFromRenderer(Editor.TextProperty, Control.Text); + } + + void OnEnded(object sender, EventArgs eventArgs) + { + Element.SetValue(VisualElement.IsFocusedPropertyKey, false); + Element.SendCompleted(); + } + + void OnStarted(object sender, EventArgs eventArgs) + { + ((IElementController)Element).SetValueFromRenderer(VisualElement.IsFocusedPropertyKey, true); + } + + void UpdateEditable() + { + Control.Editable = Element.IsEnabled; + Control.UserInteractionEnabled = Element.IsEnabled; + + if (Control.InputAccessoryView != null) + Control.InputAccessoryView.Hidden = !Element.IsEnabled; + } + + void UpdateFont() + { + Control.Font = Element.ToUIFont(); + } + + void UpdateKeyboard() + { + Control.ApplyKeyboard(Element.Keyboard); + } + + void UpdateText() + { + // ReSharper disable once RedundantCheckBeforeAssignment + if (Control.Text != Element.Text) + Control.Text = Element.Text; + } + + void UpdateTextColor() + { + var textColor = Element.TextColor; + + if (textColor.IsDefault) + Control.TextColor = UIColor.Black; + else + Control.TextColor = textColor.ToUIColor(); + } + } +}
\ No newline at end of file |