(de)激活约束如何在内部工作?

时间:2018-06-14 17:26:51

标签: ios

我注意到当我激活一个约束时,我立即 - 在那行代码中 - 得到一个警告,即不能同时满足约束。

我认为布局是在“UI更新周期”之类的某个时间点计算的,而不是每次约束都被激活。因此,在(de)激活约束的代码块中,必须注意顺序,以便布局始终可以满足。这是对的吗?

是否有一些优雅的方法来重写以下代码,以便它不会因同时激活两个约束而触发警告?

func switchConstraints() {
    constraint1.isActive = flag
    constraint2.isActive = !flag
}

1 个答案:

答案 0 :(得分:1)

一种选择是覆盖updateViewConstraints()。在那里,您可以在没有警告的情况下激活/停用约束。

沿着这些方向:

@IBAction func doUp(_ sender: Any) {
    flag = !flag
    self.view.setNeedsUpdateConstraints()
}

override func updateViewConstraints() {
    constraint1.isActive = flag
    constraint2.isActive = !flag
    super.updateViewConstraints()
}

另一个选择是激活两个约束,但给它们不同的优先级。然后更改优先级而不是激活/停用:

    // in viewDidLoad, or wherever you created the constraints
    constraint1.priority = .defaultHigh
    constraint2.priority = .defaultLow

    constraint1.isActive = true
    constraint2.isActive = true

然后,也许按下按钮:

    @IBAction func doUp(_ sender: Any) {
        flag = !flag
        constraint1.priority = flag ? .defaultHigh : .defaultLow
        constraint2.priority = flag ? .defaultLow : .defaultHigh
    }