gpt4 book ai didi

ios - 使用 Xamarin 在 iOS 中使用自动布局绘制元素的相对定位

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:15:56 26 4
gpt4 key购买 nike

我目前正在开发一个 Xamarin iOS 应用程序,它使用自动布局将元素定位在我的 View 中。我想根据通过自动布局定位的其他 subview 绘制元素并定位它们。

我的问题是,draw 方法在创建 subview 布局之前以及它们在我的 View 中定位之前被调用,所以我无法传递相对位置作为起点到要绘制的 View 。我只能通过在 ViewDidLayoutSubviews 而不是 ViewDidLoad 方法中添加绘制的 subview 来做到这一点。我认为这不是一个非常优雅的解决方案,我想知道是否有任何其他方法可以定位必须通过相对起点绘制的元素?

下面是一些示例代码:

显示元素的 ViewController:

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();
}
}

画圆的CircleView:

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);

}
}

最佳答案

我终于找到了适合我的答案。

ViewDidLoad 方法中,我创建了另一个 subview ,将 circleView 添加到该 subview 并将 subview 添加到我的 containerView。 circleView 获取起点 0,0 并且我为 subview 添加约束以将其定位在 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));

关于ios - 使用 Xamarin 在 iOS 中使用自动布局绘制元素的相对定位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29388365/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com