从 cellForRowAt 更新时,UITableViewCell 中的活动约束不会更新
Posted
技术标签:
【中文标题】从 cellForRowAt 更新时,UITableViewCell 中的活动约束不会更新【英文标题】:Active constraints in UITableViewCell don't get updated when updated from cellForRowAt 【发布时间】: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 那是我发布的答案 【参考方案1】:当您停用您的约束时,它将由 ARC 释放,因为它是您的 vc 中的弱属性。 你可以通过移除弱来改变来处理这个问题。
@IBOutlet var leading: NSLayoutConstraint!
@IBOutlet var leadingSpace: NSLayoutConstraint!
但是如果你不想发生内存泄漏,你需要在不需要它们之后立即释放它们
【讨论】:
你是正确的释放。但这并不能解决问题。【参考方案2】:尝试优先激活/停用约束调用addConstraint
和removeConstraint
内部
func setActiveConstraint(ye:Bool)
leading.priority = !ye ? 999 : 250
leading.priority = ye ? 999 : 250
【讨论】:
【参考方案3】:有一种方法可以在不改变优先级的情况下做到这一点:
-
在您的
UITableViewCell
中覆盖updateConstraints()
在那里激活/停用约束
请务必在最后致电super.updateConstraints()
【讨论】:
以上是关于从 cellForRowAt 更新时,UITableViewCell 中的活动约束不会更新的主要内容,如果未能解决你的问题,请参考以下文章
更改 tableview 高度后 CellForRowAt 不调用
numberOfRowsInSection 已调用但 cellForRowAt 未调用
当按钮收到事件时,UITapGestureRecognizer 到 cellForRowAt
如何从 cellForRowAt 调用 draw(_ rect: CGRect) 在自定义 tableview 上绘图?