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

Ori*_*rds 11 ios autolayout nslayoutconstraint swift

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

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

选项1:

parent.addConstraints([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])
Run Code Online (Sandbox Code Playgroud)

选项2:

child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20).isActive = true
child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5).isActive = true
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

Fir*_*iro 26

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

在为iOS 8.0或更高版本开发时,将约束的active属性设置为YES,而不是直接调用addConstraint:方法.活动属性会自动添加和删除正确视图中的约束.(参考)

另外,如果你看一下addConstraint:它的接口定义有这个评论:

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


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

NSLayoutConstraint.activate([
    child.topAnchor.constraint(equalTo: parent.topAnchor, constant: 20),
    child.leftAnchor.constraint(equalTo: parent.leftAnchor, constant: 5) ])
Run Code Online (Sandbox Code Playgroud)

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

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

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