Posicionamiento relativo de elementos dibujados con autolayout en iOS usando Xamarin

Actualmente estoy trabajando en una aplicación Xamarin iOS usando Autolayout para ubicar los elementos dentro de mis Vistas. Quiero dibujar elementos y posicionarlos en function de otras subvistas que se posicionan a través de Autolayout.

Mi problema es que el método draw se invoca antes de que se cree el layout de las subvistas y antes de que se coloquen en mi vista, por lo que no puedo pasar una position relativa como el punto inicial de la vista que se va a dibujar. Solo puedo hacer esto agregando las subvistas dibujadas en ViewDidLayoutSubviews no están en el método ViewDidLoad . Creo que esta no es una solución muy elegante y me pregunto si hay alguna otra forma de posicionar los elementos que deben dibujarse pasando un punto de partida relativo.

Aquí hay un código de ejemplo:

Un ViewController para mostrar los elementos:

 public class QuestionViewController : BaseController { private UILabel _infoLabel; private UIButton _button1; public override void ViewDidLoad() { UIView containerView = View; containerView.BackgroundColor = UIColor.White; var constraints = new List<NSLayoutConstraint>(); _infoLabel = new UILabel() { IsAccessibilityElement = true, TranslatesAutoresizingMaskIntoConstraints = false, Text = "My Info Label", LineBreakMode = UILineBreakMode.WordWrap, Lines = 2, Font = UICore.TextFont, TextColor = UICore.TextColor }; containerView.AddSubview(_infoLabel); constraints.Add(NSLayoutConstraint.Create(_infoLabel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, containerView, NSLayoutAttribute.Bottom, 1f, 10f)); constraints.Add(NSLayoutConstraint.Create(_infoLabel, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, containerView, NSLayoutAttribute.Leading, 1f, 10f)); constraints.Add(NSLayoutConstraint.Create(_infoLabel, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, containerView, NSLayoutAttribute.Trailing, 1f, -10f)); containerView.AddConstraints(constraints.ToArray()); base.ViewDidLoad(); } public override void ViewDidLayoutSubviews() { var containerView = View; var myCircle = new CircleView(new RectangleF((float)_infoLabel.Frame.X, (float)_infoLabel.Frame.Bottom, 60, 60), UIColor.Red, "TEST"); containerView.AddSubview(myCircle); base.ViewDidLayoutSubviews(); } } 

The CircleView para dibujar un círculo:

 public class CircleView : UIView { private UIColor _color; private string _label; public CircleView() { Initialize(); } public CircleView(RectangleF bounds, UIColor color, string label) : base(bounds) { _label = label; _color = color; Initialize(); } void Initialize() { BackgroundColor = UIColor.White; } public override void Draw(CGRect rect) { var context = UIGraphics.GetCurrentContext(); context.SetFillColor(_color.CGColor); context.FillEllipseInRect(rect); } } 

Finalmente encontré una respuesta que está funcionando para mí.

En el método ViewDidLoad , creo otra subvista, agrega circleView a esta subvista y agrega la subvista a my containerView. El circleView obtiene el punto de inicio 0,0 y agrego restricciones para la subvista para ubicarlo dentro de containerView:

 var dummyView = new UIView(); dummyView.AddSubview(new CircleView(new RectangleF(0f, 0f, 60, 60), UIColor.Red, "TEST");) containerView.AddSubview(dummyView); constraints.Add(NSLayoutConstraint.Create(dummyView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, _infoLabel, NSLayoutAttribute.Bottom, 1f, 10f)); constraints.Add(NSLayoutConstraint.Create(dummyView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, containerView, NSLayoutAttribute.Leading, 1f, 10f));