我在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);
}
}
}
答案 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)
});
}