代码之家  ›  专栏  ›  技术社区  ›  fhucho

(取消)激活约束是如何在内部工作的?

ios
  •  0
  • fhucho  · 技术社区  · 6 年前

    我注意到,当我激活一个约束时,我立即——在那一行代码——得到一个警告,即不能同时满足约束。

    我假设布局是在“UI更新周期”之类的后期点计算的,而不是每次约束被(取消)激活时。因此,在一块(取消)激活约束的代码中,必须注意顺序,这样布局总是可以满足的。对吗?

    是否有一些优雅的方法来重写下面的代码,这样它就不会因为两个约束同时处于活动状态而触发警告?

    func switchConstraints() {
        constraint1.isActive = flag
        constraint2.isActive = !flag
    }
    
    1 回复  |  直到 6 年前
        1
  •  1
  •   DonMag    6 年前

    一种选择是重写 updateViewConstraints() .在那里,您可以激活/停用约束,而不必发出警告。

    沿着这些线:

    @IBAction func doUp(_ sender: Any) {
        flag = !flag
        self.view.setNeedsUpdateConstraints()
    }
    
    override func updateViewConstraints() {
        constraint1.isActive = flag
        constraint2.isActive = !flag
        super.updateViewConstraints()
    }
    

    另一种选择是激活这两个约束,但赋予它们不同的优先级。然后更改优先级,而不是激活/停用:

        // in viewDidLoad, or wherever you created the constraints
        constraint1.priority = .defaultHigh
        constraint2.priority = .defaultLow
    
        constraint1.isActive = true
        constraint2.isActive = true
    

    然后,点击按钮:

        @IBAction func doUp(_ sender: Any) {
            flag = !flag
            constraint1.priority = flag ? .defaultHigh : .defaultLow
            constraint2.priority = flag ? .defaultLow : .defaultHigh
        }