从cellForRowAt更新时,UITableViewCell中的活动约束不会更新

时间:2018-06-11 10:05:48

标签: ios swift uitableview constraints

我有一个视图,其中两个主要约束相互冲突。一个具有前导偏移,另一个没有。 '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)
}

3 个答案:

答案 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)

有一种方法可以不更改优先级:

  1. 在您的updateConstraints()中覆盖UITableViewCell
  2. 在那里激活/停用约束
  3. 请务必在最后致电super.updateConstraints()