为了简便起见,我评论创建左约束,而且只显示了用于创建宽度约束代码。
由于编码,在每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
的宽度,并且该约束添加到rowView
。
这难道不意味着我有firstButton
多个宽度限制?或做后续的宽度限制替换以前的?
约束不起作用像编程语言的常规任务。因此,分配一个项目的一个属性并不意味着每次都将其覆盖。想想约束方程左右系统,因为其实他们是方程组。当自动布局尝试计算若干意见大小简单地解决了基于您的约束这个方程系统。这就是为什么有时候你看到里面的故事板约束的模糊警告,因为没有足够的信息,在你的约束,成功地解决了系统并找到值,所有的变量。
因此,在你的情况下,系统会是这样
a = b
a = c
a + b + c = 300
您可以轻松地计算出a
,b
和c
都有100
的价值。所有这些都在你的情况下按钮width
。你可以看到您分配a
两次,但没有像编程语言的任务,而是一个等号就像代数。所以,这就是为什么它是确定有多个约束来看一个参数,但它们必须是可以解决的。
如果你有约束,其中一个告诉宽度必须100pt
和另一个 - 这>200pt
有冲突。你需要自己去解决它。
你可以阅读更多here in Apple docs。