¿UILabel con relleno en Xamarin.iOS?

Estoy intentando crear un UILabel con relleno en mi aplicación Xamarin.iOS. La solución más popular en las aplicaciones nativas de Objective-C es anular drawTextInRect :

 - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {0, 5, 0, 5}; return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)]; } 

Tan simple como parece, no puedo entender cómo traducirlo a C #. Aquí tengo mi mejor puñalada:

 internal class PaddedLabel : UILabel { public UIEdgeInsets Insets { get; set; } public override void DrawText(RectangleF rect) { var padded = new RectangleF(rect.X + Insets.Left, rect.Y, rext.Width + Insets.Left + Insets.Right, rect.Height); base.DrawText(padded); } } 

Esto parece mover el text de la label, pero no cambia el tamaño de la label.

Creo que el problema principal es que no puedo encontrar el equivalente de Xamarin de UIEdgeInsetsInsetRect .

¿Alguna sugerencia?

El equivalente C # de la function UIEdgeInsetsInsetRect es un método de instancia de UIEdgeInsets denominado InsetRect y no es idéntico a sus cálculos RectangleF (que probablemente sea su problema).

Para usarlo puedes hacer:

 public override void DrawText(RectangleF rect) { base.DrawText (Insets.InsetRect (rect)); } 

He creado una class Genid Padding UIView que envuelve cualquier elemento de IOS UI derivado de UIView.

Básicamente, anida la UIView deseada en otra vista y se encarga de todo el trabajo de relleno.

uso:

 var myPaddedView = new PaddedUIView<UILabel>(); myPaddedView.Frame = TheActualFrame; myPaddedView.Padding = 15f myPaddedView.NestedView.Text = "Hello padded world"; // all the label Properties are available without side effects 

Aquí está la class:

 public class PaddedUIView<T>: UIView where T : UIView, new() { private float _padding; private T _nestedView; public PaddedUIView() { Initialize(); } public PaddedUIView(RectangleF bounds) : base(bounds) { Initialize(); } void Initialize() { if(_nestedView == null) { _nestedView = new T(); this.AddSubview(_nestedView); } _nestedView.Frame = new RectangleF(_padding,_padding,Frame.Width - 2 * _padding, Frame.Height - 2 * _padding); } public T NestedView { get { return _nestedView; } } public float Padding { get { return _padding; } set { if(value != _padding) { _padding = value; Initialize(); }} } public override RectangleF Frame { get { return base.Frame; } set { base.Frame = value; Initialize(); } } } 

En lugar de anular DrawText () en la subclass de UILabel, anule su tamaño de contenido intrínseco. De esta forma, el layout automático toma en count el relleno. Por ejemplo, aquí está mi class derivada de UILabel:

 public class PaddedLabel : UILabel { private readonly float _top; private readonly float _left; private readonly float _right; private readonly float _bottom; public PaddedLabel(float top, float left, float right, float bottom) { _top = top; _left = left; _right = right; _bottom = bottom; } public override CGSize IntrinsicContentSize => new CGSize( base.IntrinsicContentSize.Width + _left + _right, base.IntrinsicContentSize.Height + _top + _bottom ); }