在单个UIButton上具有多个宽度约束意味着什么?

时间:2019-02-08 20:29:04

标签: ios swift constraints

为简便起见,我评论了创建左侧约束的情况,并且仅显示了创建宽度约束的代码。

按照编码,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上有多个宽度限制吗?还是用后续的宽度约束代替以前的约束?

1 个答案:

答案 0 :(得分:0)

约束与编程语言中的常规分配不同。因此,为一项分配一个属性并不意味着每次都覆盖它。将约束视为方程系统,因为实际上它们是方程系统。当“自动布局”尝试计算视图的大小时,它只是根据您的约束来解决此方程组。这就是为什么有时您会在情节提要板中看到约束模糊性警告的原因,因为约束中没有足够的信息来成功解决系统并找到所有变量的值。

所以您的情况就是这样

a = b
a = c
a + b + c = 300

您可以轻松地计算出abc的值均为100。在您的情况下,所有按钮都是width个按钮。您会看到两次分配a,但是没有像编程语言那样的分配,而是像代数那样的等号。因此,这就是为什么可以对一个视图参数具有多个约束,但是它们必须可解的原因。

如果您有约束,则其中一个约束告诉宽度必须为100pt,而另一个约束告诉>200pt存在冲突。您需要自己解决。

您可以阅读更多here in Apple docs