我是Programmatic UI的新手,我以前总是依靠情节提要,并且我在autolayout的规则中苦苦挣扎。
当我开始学习没有情节提要的开发工具时,我在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
中的约束?
答案 0 :(得分:1)
updateConstraints
的目的是要说明的-如果需要,请更新现有约束。当您调用setNeedsUpdateConstraints
时,系统会调用该方法,因此无需实现。可以按照在init
方法中进行设置的方式来设置约束。这就是文档所说的:
在发生影响性更改之后,几乎总是更干净,更容易立即更新约束。例如,如果您想响应按钮的点击来更改约束,请直接在按钮的操作方法中进行更改。
仅当在适当位置更改约束太慢或视图产生大量冗余更改时,才应覆盖此方法
您的实施应该高效,这意味着您不应激活或停用updateConstraints
中的约束。我也发现此article有用。
希望这会有所帮助!