我使用可视化格式来定义约束。目标是在超级视图的底部放置一个UIView,将self.view的高度固定为40,并自动调整宽度。我使用Storyboard完成了这个,但我无法以编程方式执行此操作。这是我写的代码。如果我没有给出固定宽度,应用程序崩溃。它崩溃了以下约束:“H:[redView] |”。如果我将其更改为“H:[redView(100)]”,它可以工作。我不想使用self.bounds并从那里获得宽度。它应该从超视图的左侧,视图的底部和右侧粘住。
请帮忙!
NSDictionary *viewsDictionary = @{@"redView":self.redView};
NSArray *constraint_H = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]"
options:0
metrics:nil
views:viewsDictionary];
NSArray *constraint_V = [NSLayoutConstraint constraintsWithVisualFormat:@"H:[redView]|"
options:0
metrics:nil
views:viewsDictionary];
// 3. Define the redView Position
NSArray *constraint_POS_V = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView]|"
options:0
metrics:nil
views:viewsDictionary];
NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]"
options:0
metrics:nil
views:viewsDictionary];
[self.redView addConstraints:constraint_H];
[self.redView addConstraints:constraint_V];
[self.view addConstraints:constraint_POS_H];
[self.view addConstraints:constraint_POS_V];
答案 0 :(得分:2)
您需要先将redView
添加到其超级视图中。
此外,约束将添加到超级视图,而不是redView
。
[self.view addSubview:self.redView];
// create your constraints here
[self.view addConstraints:@[constraint_H, constraint_V, constraint_POS_V, constraint_POS_H]];
[self.view updateConstraintsIfNeeded];
答案 1 :(得分:1)
在视觉约束语法中,|
引用父视图。你之前有这种水平约束的方式,将它添加到redview
,它被解释为redview
有一个孩子,称为相同,显然不存在,所以它崩溃了。
垂直约束的工作方式是因为它不引用父视图。
您可以稍微更改一下代码,以使约束更清晰:
NSArray *verticalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:[redView(40)]|" options:0 metrics:nil
views:viewsDictionary];
NSArray *horizontalConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[redView]|" options:0 metrics:nil
views:viewsDictionary];
[self.view addConstraints:horizontalConstraints];
[self.view addConstraints:verticalConstraints];
请记住,您应该始终将UIView
的约束添加到superview
。
答案 2 :(得分:0)
更改此行
[self.redView addConstraints:constraint_V];
与
[self.view addConstraints:constraint_V];
解决了自己。谢谢我...... :)
答案 3 :(得分:0)
如果你想获取视图的宽度并将其应用于红色视图,你只需要添加一个类似的约束:
NSArray *constraint_POS_H = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[redView]-|"
options:0
metrics:nil
views:viewsDictionary];