我有一个视图,其中两个主要约束相互冲突。一个具有前导偏移,另一个没有。 'constant'属性适用于主动约束。但我想启用/禁用约束以满足我的需求。当从UITableViewCell
调用时,它适用于tableView:cellForRowAtIndexPath:
以外的每个地方。
这是我的手机:
class WowCell: UITableViewCell {
@IBOutlet weak var myView: UIView!
@IBOutlet var leading: NSLayoutConstraint!
@IBOutlet var leadingSpace: NSLayoutConstraint!
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func setup(ye:Bool) {
setActiveConstraint(ye: ye)
//doesn't help
setNeedsLayout()
layoutIfNeeded()
needsUpdateConstraints()
setNeedsUpdateConstraints()
needsUpdateConstraints()
setNeedsLayout()
setNeedsDisplay()
}
func setActiveConstraint(ye:Bool){
leading.isActive = !ye
leadingSpace.isActive = ye
}
override func layoutSubviews() {
//when called from here, it does work
}
}
提前致谢
编辑:正如Prashant Tukadiya建议的那样,它通过改变两个主动约束的优先级来起作用。但请注意,两个约束都必须是lower than 1000。
func setActiveConstraint(ye:Bool){
leading.priority = UILayoutPriority(rawValue: !ye ? 999 : 250)
leadingSpace.priority = UILayoutPriority(rawValue: ye ? 999 : 250)
}
答案 0 :(得分:0)
当您取消约束时,它将由ARC释放,因为它在您的vc中属于弱属性。 你可以通过删除弱来改变它来处理它。
@IBOutlet var leading: NSLayoutConstraint!
@IBOutlet var leadingSpace: NSLayoutConstraint!
但是如果你不想要内存泄漏,你需要在他们不需要之后立即发布它们
答案 1 :(得分:0)
尝试使用优先级作为活动/停用约束调用addConstraint
和内部removeConstraint
func setActiveConstraint(ye:Bool){
leading.priority = !ye ? 999 : 250
leading.priority = ye ? 999 : 250
}
答案 2 :(得分:0)
有一种方法可以不更改优先级:
updateConstraints()
中覆盖UITableViewCell
super.updateConstraints()