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

Posted

技术标签:

【中文标题】iOS 约束样式:addConstraints vs .isActive = true【英文标题】:iOS constraint style: addConstraints vs .isActive = true 【发布时间】:2016-10-09 00:54:35 【问题描述】:

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

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

选项 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】:

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

为 iOS 8.0 或更高版本开发时,将约束设置为 active 属性设置为 YES 而不是直接调用 addConstraint: 方法。 active 属性自动添加和删除约束 正确的看法。 (reference)

此外,如果您查看 addConstraint: 的接口定义,它有以下注释:

// 此方法将在未来的版本中弃用,应为 避免。相反,将 NSLayoutConstraint 的 active 属性设置为 YES


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

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

这也是根据文档和接口文件推荐的解决方案。因此,如果您有多个限制条件,这将是一个简单的解决方案,并且在您的情况下可能是首选。

(界面注释;强调我的):

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

【讨论】:

顺便说一句,看起来“activateConstraints”已重命名为“activate”:developer.apple.com/reference/uikit/nslayoutconstraint/… 感谢您的关注!我更新了它。对于未来,请随时自行编辑答案:D。再次感谢!

以上是关于iOS 约束样式:addConstraints vs .isActive = true的主要内容,如果未能解决你的问题,请参考以下文章

mysql常用命令总结

i MySQL 查看约束,添加约束,删除约束

转载:oracle添加约束禁用延迟

iOS:addConstraints:崩溃的应用程序

iOS:如何在没有 someView.addConstraints 的情况下使用 constraintsWithVisualFormat?

iOS9.0中的动画锚样式约束