如何在Swift中以编程方式更改布局约束?

Kev*_*VuD 6 ios nslayoutconstraint swift

我有一个集合视图,每个单元格都有一个textView.这是我的textview约束设置

textView.topAnchor.constraint(equalTo: object1.bottomAnchor).isActive = true
textView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
Run Code Online (Sandbox Code Playgroud)

...我的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
}
Run Code Online (Sandbox Code Playgroud)

Mil*_*sáľ 17

您必须停用旧的活动约束.现在,您只是向视图添加新约束.所以首先我建议你创建两个属性来保持对约束的引用:

fileprivate var topConstraint1: NSLayoutConstraint?
fileprivate var topConstraint2: NSLayoutConstraint?
Run Code Online (Sandbox Code Playgroud)

然后在开始时,在创建UI时,正确初始化它们:

topConstraint1 = textView.topAnchor.constraint(equalTo: object1.bottomAnchor)
topConstraint2 = textView.topAnchor.constraint(equalTo: object2.bottomAnchor)
Run Code Online (Sandbox Code Playgroud)

并首先激活您想要激活的那个:

topConstraint1?.isActive = true
Run Code Online (Sandbox Code Playgroud)

然后,当您想要更改约束时,首先停用应该停用的约束,然后激活正确的约束:

if aCondition {
    topConstraint1?.isActive = false
    topConstraint2?.isActive = true
} else {
    topConstraint2?.isActive = false
    topConstraint1?.isActive = true
}
Run Code Online (Sandbox Code Playgroud)

PS:您总是希望先停用旧的,然后激活新的,否则当您激活新的时,它将与旧的冲突,并在控制台中引起警告.