【发布时间】:2018-06-11 10:05:48
【问题描述】:
我有一个包含两个相互冲突的主要约束的视图。一个有前导偏移,另一个没有。 'constant' 属性适用于主动约束。但我想启用/禁用约束以满足我的需求。当从tableView:cellForRowAtIndexPath: 调用时,它可以在除UITableViewCell 之外的所有地方使用。
这是我的手机:
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)
}
【问题讨论】:
-
为什么不直接通过维护单个约束而不是两个约束来更改常量值
-
@Prashant Tukadiya 因为计算常数并不总是很方便。这段代码只是一个简化的例子。
-
不方便计算常数是什么意思?你能请。添加更多您确切需要的信息。可能还有其他解决方案
-
@PrashantTukadiya 对我来说,将优先级更改为激活/停用约束是与直接激活/停用相比的一种解决方法
-
@derpoliuk 那是我发布的答案
标签: ios swift uitableview constraints