我有一些代码以编程方式创建自动布局约束,并将它们添加到视图中。
有两种方法可以做到这一点 - 在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)
答案 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的方式相同。 通常更多 比单独激活每个约束更有效。