通过降低优先级来解决约束冲突
问题: 有时候对一个view的同一个位置约束 不得不做两个约束来控件时,如果不对其中之一做优先级处理会引起约束冲突:
例子: 给tableViewCell 中添加一个上下左右都等于cell大小的view, 并对这个cell设置为自动高度,也就是由里面的view来将它撑起来。
比如:cell 里面的setupUI可以这样写:
private func setupUI() {
addSubview(view)
view.snp.makeConstraints { (make) in
make.height.equalTo(100)
make.edges.equalToSuperview()
}
}
高度 和 上下约束 没有任何一个都撑不开cell,但很明显,高度与上下之一又重复了,这时候会报约束冲突。
解决办法,降低一个约束的优先级:
private var viewHeightConstraint: Constraint?
private func setupUI() {
addSubview(view)
view.snp.makeConstraints { (make) in
make.top.leading.trailing.equalToSuperview()
make.bottom.equalToSuperview().priorityHigh() //降低
viewHeightConstraint = make.height.equalTo(100).constraint //listViewHeightConstraint用来动态控制高度
viewHeightConstraint?.activate()
}
}
这样,假如需要动态控制高度,就可以利用 listViewHeightConstraint 了
比如:
func setup(height: CGFloat = 100) {
viewHeightConstraint?.update(offset: listViewHeight)
view.updateConstraintsIfNeeded()
}
// offset 是这个,不是inset
//注意这里,除了使用updateConstraintsIfNeeded(), 还可以使用 setNeedsUpdateConstraints(), 但不能直接调用 “updateConstraints”去更新。