从 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】:

尝试优先激活/停用约束调用addConstraintremoveConstraint内部

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 上绘图?

在 CellForRowAt 中包含用于自定义 UIView 的 nib 文件,在滚动时会产生 jerk

如何在uitableview的cellForRowAt函数中按标题日期对响应进行排序