我注意到当我激活一个约束时,我立即 - 在那行代码中 - 得到一个警告,即不能同时满足约束。
我认为布局是在“UI更新周期”之类的某个时间点计算的,而不是每次约束都被激活。因此,在(de)激活约束的代码块中,必须注意顺序,以便布局始终可以满足。这是对的吗?
是否有一些优雅的方法来重写以下代码,以便它不会因同时激活两个约束而触发警告?
func switchConstraints() {
constraint1.isActive = flag
constraint2.isActive = !flag
}
答案 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
}