Swift编程UI-为什么/何时对自定义对象使用updateConstraint方法



我是编程UI的新手,我过去总是依赖故事板,我正在努力解决自动布局的规则。

当我开始学习在没有故事板的情况下开发时,我在Medium上找到了这个教程:https://medium.com/written-code/creating-uiviews-programmatically-in-swift-55f5d14502ae

它解释说,当构建自定义UIView子类时,我们必须在updateConstraints()方法中设置约束,就像一样

class MyCustomView: UIView {
var shouldSetupConstraints = true
init(){
super.init(frame: CGRect.zero)
setupViews()
// NOT HERE for constraints
}
...
override func updateConstraints() {
if(shouldSetupConstraints) {
// Setting Constraints HERE
setViewsConstraints()
shouldSetupConstraints = false
}
super.updateConstraints()
}
fileprivate func setViewsConstraints(){
// Adding constraints, nothing special here
}
}

在我进入UITableViewCell子类之前,一切都很好。我尝试在这里使用相同的方法,通过在updateConstraints方法中放置约束。然而,通过这样做,在重新加载tableView时,我的约束从未被计算出来。我必须像普通出口一样计算约束:

class MyCustomCell: UITableViewCell {
var shouldSetupConstraints = true
init(){
super.init(frame: CGRect.zero)
setupViews()
setupViewsContraints() 
// Layout HERE for UITableViewCEll
}
}

所以我有点困惑,什么时候应该使用第一种方法,什么时候不应该。因此,我的问题是为什么以及何时必须覆盖updateCosntraints,以及何时必须计算init中的约束

updateConstraints的目的就是它所说的——如果需要,更新现有的约束。当你调用setNeedsUpdateConstraints时,系统会调用该方法,而不需要实现它。可以像在init方法中那样设置约束。这就是文件中所说的:

在发生影响更改后立即更新约束几乎总是更干净、更容易。例如,如果要更改约束以响应按钮点击,请直接在按钮的操作方法中进行更改。

只有当更改约束的速度太慢,或者视图正在产生大量冗余更改时,才应该覆盖此方法

您的实现应该是高效的,这意味着您不应该激活或停用updateConstraints内部的约束。我也觉得这篇文章很有帮助。希望这能有所帮助!

最新更新