我有一个集合视图,每个单元格都有一个textView。这是我的textview约束设置
textView.topAnchor.constraint(equalTo: object1.bottomAnchor).isActive = true
textView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
...我的textView的宽度和高度。
现在,由于if条件,我想将textView的topAnchor更改为object 2 bottom anchor而不是object 1 bottom anchor。但是,当我输入下面的代码时,我得到了 将尝试通过破坏约束错误来恢复。
有人知道一旦设置好顶部锚点的方法吗?
if (aCondition){
textView.topAnchor.constraint(equalTo: object2.bottomAnchor).isActive = true
}else{
textView.topAnchor.constraint(equalTo: object1.botttomAnchor).isActive = true
}
答案 0 :(得分:13)
您必须停用旧的活动约束。现在,您只是向视图添加新约束。所以首先我建议你创建两个属性来保持对约束的引用:
fileprivate var topConstraint1: NSLayoutConstraint?
fileprivate var topConstraint2: NSLayoutConstraint?
然后在开始时,当您创建UI时,请正确初始化它们:
topConstraint1 = textView.topAnchor.constraint(equalTo: object1.bottomAnchor)
topConstraint2 = textView.topAnchor.constraint(equalTo: object2.bottomAnchor)
首先激活您想要激活的那个:
topConstraint1?.isActive = true
然后,当您想要更改约束时,首先取消激活应该停用的约束,然后激活正确的约束:
if aCondition {
topConstraint1?.isActive = false
topConstraint2?.isActive = true
} else {
topConstraint2?.isActive = false
topConstraint1?.isActive = true
}
P.S。:您总是希望先停用旧的,然后激活新的,否则当您激活新的时,它将与旧的冲突,并在控制台中引起警告。
P.S.2:如果您想一次激活多个约束,请使用NSLayoutConstraint.activate(_:)
- 按documentation,效率更高:
通常,使用此方法比单独激活每个约束更有效。
例如,而不是:
someConstraint1.isActive = true
someConstraint2.isActive = true
使用而不是:
NSLayoutConstraint.activate([someConstraint1, someConstraint2])
同样适用于停用约束和NSLayoutConstraint.deactivate(_:)
。