为简便起见,我评论了创建左侧约束的情况,并且仅显示了创建宽度约束的代码。
按照编码,rowView
中的每个按钮均等展开。当我删除创建widthConstraint
时,所有按钮都会压缩到其固有大小(rowView
中的第一个按钮除外)。该行中的第一个按钮将展开以填充。
for (index, button) in buttons.enumerated() {
if index == 0 {
// Leftmost button's left edge
// constrained to the left edge
// of the rowView
} else {
// Else constrain button's left edge to
// the right edge of the button to the left
// But what does the below width constraint
// accomplish?
let firstButton = buttons[0]
let widthConstraint = NSLayoutConstraint(item: firstButton, attribute: .width, relatedBy: .equal, toItem: button, attribute: .width, multiplier: 1.0, constant: 0.0)
widthConstraint.priority = UILayoutPriority(rawValue: 800.0)
rowView.addConstraint(widthConstraint)
}
}
因此,对于按钮数组中的每个button
,在firstButton
上创建一个宽度约束,该约束等于button
的宽度,并将该约束添加到{{1} }。
这不是说我在rowView
上有多个宽度限制吗?还是用后续的宽度约束代替以前的约束?
答案 0 :(得分:0)
约束与编程语言中的常规分配不同。因此,为一项分配一个属性并不意味着每次都覆盖它。将约束视为方程系统,因为实际上它们是方程系统。当“自动布局”尝试计算视图的大小时,它只是根据您的约束来解决此方程组。这就是为什么有时您会在情节提要板中看到约束模糊性警告的原因,因为约束中没有足够的信息来成功解决系统并找到所有变量的值。
所以您的情况就是这样
a = b
a = c
a + b + c = 300
您可以轻松地计算出a
,b
和c
的值均为100
。在您的情况下,所有按钮都是width
个按钮。您会看到两次分配a
,但是没有像编程语言那样的分配,而是像代数那样的等号。因此,这就是为什么可以对一个视图参数具有多个约束,但是它们必须可解的原因。
如果您有约束,则其中一个约束告诉宽度必须为100pt
,而另一个约束告诉>200pt
存在冲突。您需要自己解决。
您可以阅读更多here in Apple docs。