编码约束未应用于子视图

时间:2017-11-02 11:14:51

标签: c# xamarin xamarin.ios

我在Xamarin.iOS中遇到约束。

我创建了一个小测试应用程序,它应该只在我的主视图中添加绿色UIView并通过约束来定位它。我可以添加绿色视图,它将显示但仅在右上角显示。好吧,因为我为Frame之类的视图设置了this.greenView.Frame = new CGRect(0, 0, 60, 60);,所以很明显。我想要应用约束,以便绿色框与顶部,左侧和右侧相距15个点(是的,我希望盒子大于最初的60个)。

约束:

this.View.AddConstraints(new[] { NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Leading, 1, 15), NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Trailing, 1, 15), NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Top, 1, 15) });

当我运行应用程序时,绿色框仍位于右上角,大小为60x60。

你们有谁知道我做错了什么?

提前帮助你。

完整代码:

    using CoreGraphics;
    using System;

    using UIKit;

    namespace iosStackViewCoding
    {
        public partial class ViewController : UIViewController
        {
            UIView greenView = null;

            public ViewController(IntPtr handle) : base(handle)
            {
            }

            public override void ViewDidLoad()
            {
                // add sub views
                this.AddGreenBox();

                base.ViewDidLoad();
                // Perform any additional setup after loading the view, typically from a nib.
            }

            public override void DidReceiveMemoryWarning()
            {
                base.DidReceiveMemoryWarning();
                // Release any cached data, images, etc that aren't in use.
            }

            public override void ViewDidLayoutSubviews()
            {
                // Layout the view if needed.
                this.View.LayoutIfNeeded();

                // apply initial size and position
                this.greenView.Frame = new CGRect(0, 0, 60, 60);

                // add constrains.
                this.View.AddConstraints(new[] {
                    NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Leading, 1, 15),
                    NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Trailing, 1, 15),
                    NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Top, 1, 15)
                });
            }

            private void AddGreenBox()
            {
                // create view and set background
                greenView = new UIView();
                greenView.BackgroundColor = UIColor.Green;

                // add to main view
                this.View.AddSubview(greenView);
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

你的代码中有很多错误

  

1。我们不应该在ViewDidLayoutSubviews

中设置约束

在UIViewController.View布局其子视图(在修改UIKit.UIView.Bounds属性时触发)之前调用此方法,在每次调用代码View.AddConstraints时,意味着它创建重复约束所有的时间。

  

2。在我们设置约束之前,我们应该将subview.TranslatesAutoresizingMaskIntoConstraints设置为false。

TranslatesAutoresizingMaskIntoConstraints definition

  

3.约束必须足以确定位置和大小。

但是,仅设置“前导”,“尾随”,“顶部”是不够的,还应设置高度或底部。

  

4我们最好不要混合帧设置和自动布局。

使用autolayout放置视图就足够了,它的行为比帧设置好。

最终代码:

private void AddGreenBox()
{
    // create view and set background
    greenView = new UIView();
    greenView.BackgroundColor = UIColor.Green;
    this.View.AddSubview(greenView);

    greenView.TranslatesAutoresizingMaskIntoConstraints = false;

    View.AddConstraints(new[] {
        NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Leading, 1, 15),
        NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Trailing, 1, -15) ,
        NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Top, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Top, 1, 15),
        NSLayoutConstraint.Create(this.greenView, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, this.View, NSLayoutAttribute.Bottom, 1, -15)
    });
}