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

bnl4lu3b  于 2023-02-14  发布在  iOS
关注(0)|答案(1)|浏览(193)

我有一个集合视图,每个单元格都有一个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。但是,当我输入下面的代码时,我得到Will try to recover by breaking constraint错误。
有没有人知道一种方法来改变顶部锚一旦它已经成立?

if (aCondition){
textView.topAnchor.constraint(equalTo: object2.bottomAnchor).isActive = true
}else{
  textView.topAnchor.constraint(equalTo: object1.botttomAnchor).isActive = true
}
agyaoht7

agyaoht71#

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

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(_:)

相关问题