【问题标题】:Active constraints in UITableViewCell don't get updated when updated from cellForRowAt从 cellForRowAt 更新时,UITableViewCell 中的活动约束不会更新
【发布时间】: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


【解决方案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】:

    有一种方法可以在不改变优先级的情况下做到这一点:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-26
      • 2014-02-07
      • 2019-08-30
      • 2020-09-30
      • 2020-12-25
      • 1970-01-01
      • 2017-06-28
      • 1970-01-01
      相关资源
      最近更新 更多