summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs')
-rw-r--r--Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs183
1 files changed, 183 insertions, 0 deletions
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
new file mode 100644
index 00000000..f886cb35
--- /dev/null
+++ b/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
@@ -0,0 +1,183 @@
+using System;
+using System.Drawing;
+using System.ComponentModel;
+#if __UNIFIED__
+using UIKit;
+using CoreText;
+#else
+using MonoTouch.UIKit;
+using MonoTouch.CoreText;
+#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 LabelRenderer : ViewRenderer<Label, UILabel>
+ {
+ SizeRequest _perfectSize;
+
+ bool _perfectSizeValid;
+
+ public override SizeRequest GetDesiredSize(double widthConstraint, double heightConstraint)
+ {
+ if (!_perfectSizeValid)
+ {
+ _perfectSize = base.GetDesiredSize(double.PositiveInfinity, double.PositiveInfinity);
+ _perfectSize.Minimum = new Size(Math.Min(10, _perfectSize.Request.Width), _perfectSize.Request.Height);
+ _perfectSizeValid = true;
+ }
+
+ if (widthConstraint >= _perfectSize.Request.Width && heightConstraint >= _perfectSize.Request.Height)
+ return _perfectSize;
+
+ var result = base.GetDesiredSize(widthConstraint, heightConstraint);
+ result.Minimum = new Size(Math.Min(10, result.Request.Width), result.Request.Height);
+ if ((Element.LineBreakMode & (LineBreakMode.TailTruncation | LineBreakMode.HeadTruncation | LineBreakMode.MiddleTruncation)) != 0)
+ {
+ if (result.Request.Width > widthConstraint)
+ result.Request = new Size(Math.Max(result.Minimum.Width, widthConstraint), result.Request.Height);
+ }
+
+ return result;
+ }
+
+ public override void LayoutSubviews()
+ {
+ base.LayoutSubviews();
+ if (Control == null)
+ return;
+
+ SizeF fitSize;
+ nfloat labelHeight;
+ switch (Element.VerticalTextAlignment)
+ {
+ case TextAlignment.Start:
+ fitSize = Control.SizeThatFits(Element.Bounds.Size.ToSizeF());
+ labelHeight = (nfloat)Math.Min(Bounds.Height, fitSize.Height);
+ Control.Frame = new RectangleF(0, 0, (nfloat)Element.Width, labelHeight);
+ break;
+ case TextAlignment.Center:
+ Control.Frame = new RectangleF(0, 0, (nfloat)Element.Width, (nfloat)Element.Height);
+ break;
+ case TextAlignment.End:
+ nfloat yOffset = 0;
+ fitSize = Control.SizeThatFits(Element.Bounds.Size.ToSizeF());
+ labelHeight = (nfloat)Math.Min(Bounds.Height, fitSize.Height);
+ yOffset = (nfloat)(Element.Height - labelHeight);
+ Control.Frame = new RectangleF(0, yOffset, (nfloat)Element.Width, labelHeight);
+ break;
+ }
+ }
+
+ protected override void OnElementChanged(ElementChangedEventArgs<Label> e)
+ {
+ if (e.NewElement != null)
+ {
+ if (Control == null)
+ {
+ SetNativeControl(new UILabel(RectangleF.Empty) { BackgroundColor = UIColor.Clear });
+ }
+
+ UpdateText();
+ UpdateLineBreakMode();
+ UpdateAlignment();
+ }
+
+ base.OnElementChanged(e);
+ }
+
+ protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
+ {
+ base.OnElementPropertyChanged(sender, e);
+
+ if (e.PropertyName == Label.HorizontalTextAlignmentProperty.PropertyName)
+ UpdateAlignment();
+ else if (e.PropertyName == Label.VerticalTextAlignmentProperty.PropertyName)
+ LayoutSubviews();
+ else if (e.PropertyName == Label.TextColorProperty.PropertyName)
+ UpdateText();
+ else if (e.PropertyName == Label.FontProperty.PropertyName)
+ UpdateText();
+ else if (e.PropertyName == Label.TextProperty.PropertyName)
+ UpdateText();
+ else if (e.PropertyName == Label.FormattedTextProperty.PropertyName)
+ UpdateText();
+ else if (e.PropertyName == Label.LineBreakModeProperty.PropertyName)
+ UpdateLineBreakMode();
+ }
+
+ protected override void SetBackgroundColor(Color color)
+ {
+ if (color == Color.Default)
+ BackgroundColor = UIColor.Clear;
+ else
+ BackgroundColor = color.ToUIColor();
+ }
+
+ void UpdateAlignment()
+ {
+ Control.TextAlignment = Element.HorizontalTextAlignment.ToNativeTextAlignment();
+ }
+
+ void UpdateLineBreakMode()
+ {
+ _perfectSizeValid = false;
+
+ switch (Element.LineBreakMode)
+ {
+ case LineBreakMode.NoWrap:
+ Control.LineBreakMode = UILineBreakMode.Clip;
+ Control.Lines = 1;
+ break;
+ case LineBreakMode.WordWrap:
+ Control.LineBreakMode = UILineBreakMode.WordWrap;
+ Control.Lines = 0;
+ break;
+ case LineBreakMode.CharacterWrap:
+ Control.LineBreakMode = UILineBreakMode.CharacterWrap;
+ Control.Lines = 0;
+ break;
+ case LineBreakMode.HeadTruncation:
+ Control.LineBreakMode = UILineBreakMode.HeadTruncation;
+ Control.Lines = 1;
+ break;
+ case LineBreakMode.MiddleTruncation:
+ Control.LineBreakMode = UILineBreakMode.MiddleTruncation;
+ Control.Lines = 1;
+ break;
+ case LineBreakMode.TailTruncation:
+ Control.LineBreakMode = UILineBreakMode.TailTruncation;
+ Control.Lines = 1;
+ break;
+ }
+ }
+
+ void UpdateText()
+ {
+ _perfectSizeValid = false;
+
+ var values = Element.GetValues(Label.FormattedTextProperty, Label.TextProperty, Label.TextColorProperty);
+ var formatted = (FormattedString)values[0];
+ if (formatted != null)
+ Control.AttributedText = formatted.ToAttributed(Element, (Color)values[2]);
+ else
+ {
+ Control.Text = (string)values[1];
+ // default value of color documented to be black in iOS docs
+ Control.Font = Element.ToUIFont();
+ Control.TextColor = ((Color)values[2]).ToUIColor(ColorExtensions.Black);
+ }
+
+ LayoutSubviews();
+ }
+ }
+} \ No newline at end of file