尽管我喜欢自动布局作为一个概念,但我似乎总是在实施细节上绊倒。其中之一就是我真的厌倦了存储应用于给定子视图的约束,所以我可以在以后删除并替换它们。
例如,当我第一次添加视图时,我可能会给它约束:
@"H:[view(==200)]|"
将它放在屏幕的右侧,宽度为200.如果我后来想让它宽400,间隙为200,怎么办?新布局很简单,但与旧布局直接相矛盾:
@"H:[view(==200)]-(200)]|"
所以我必须保存约束数组,以便稍后我可以使用它们来删除所述约束。有得到是一个更简单的解决方案,我在某处丢失。遗憾的是,[视图约束]的明显解决方案没有意义,因为您不直接将约束应用于给定视图,而是将它们应用于它的超视图。 (另外,它往往充满自动布局约束,使其自己的对象适合 - 而不是你想要移除的东西只是为了调整它的位置!)并且似乎没有任何[view constraintsForSubview:]选项可用
我是瞎了吗?遗漏了什么?我是否真的需要处理现有约束的字典,以便以后修复它们?答案 0 :(得分:20)
您可以将IBOutlet设置为约束并更改代码中的常量参数。所以,如果你想要做的就像你的例子,你可以这样做(调用宽度约束widthCon):
self.widthCon.constant = 400;
这样就可以将约束条件保留在200的右侧(如果你想改变那条约束,也可以为那个约束出口)。
如果您确实要保存(或删除)特定视图的约束,可以使用与此类似的方法:
for (NSLayoutConstraint *con in self.view.constraints) {
if (con.firstItem == self.leftButton || con.secondItem == self.leftButton) {
[self.portraitConstraints addObject:con];
}
}
当然,您可以在UIView上创建一个类别,使用类似的东西来制作viewConstraintsForView:方法。