iOS约束样式:addConstraints vs .isActive = true

时间:2016-10-09 00:54:36

标签: ios swift autolayout nslayoutconstraint

我有一些代码以编程方式创建自动布局约束,并将它们添加到视图中。

有两种方法可以做到这一点 - 在superView上调用addConstraints,或在每个约束上设置.isActive = true(内部调用addConstraint)

选项1:

parent.addConstraints([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])

选项2:

child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20).isActive = true
child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5).isActive = true

我的问题是,做一个比另一个有什么好处吗? (表演/等)或者纯粹是风格。

(我不认为约束会在下一个布局传递之前进行评估,所以我认为我们不能逐个添加它们而不是在块中?)

如果它只是风格,那么社区的“更受欢迎”风格是什么?

(我个人更喜欢addConstraints,但它非常接近,我可以很容易地摇摆到.isActive)

1 个答案:

答案 0 :(得分:25)

根据addConstraint:设置的文档,个别约束建议使用active属性。 (注意:active属性仅适用于iOS 8 +)。

  

为iOS 8.0或更高版本开发时,请设置约束的活动状态   属性为YES而不是直接调用addConstraint:方法。   活动属性会自动添加和删除约束   正确的观点。 (reference

另外,如果你查看addConstraint:的接口定义,它会有这样的评论:

  

//此方法将在以后的版本中弃用,应该是   避免。而是将NSLayoutConstraint的活动属性设置为YES

话虽如此,实际上有一个第三[可能更好]的替代方案,即使用NSLayoutConstraint的类方法activate:

NSLayoutConstraint.activate([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])

根据文档和界面文件,这也是推荐的解决方案。因此,如果您有多个约束,这将是一个简单的解决方案,可能在您的情况下首选。

(界面评论;强调我的):

  

激活包含中的每个约束的便捷方法   数组,与设置active = YES的方式相同。 通常更多   比单独激活每个约束更有效。