Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/103.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 如何在Swift中以编程方式更改布局约束?_Ios_Swift_Nslayoutconstraint - Fatal编程技术网

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

Ios 如何在Swift中以编程方式更改布局约束?,ios,swift,nslayoutconstraint,Ios,Swift,Nslayoutconstraint,我有一个集合视图,每个单元格都有一个文本视图。这是我的文本视图约束设置 textView.topAnchor.constraint(equalTo: object1.bottomAnchor).isActive = true textView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true …以及我的文本视图的宽度和高度 现在,由于if条件,我想将textView的topAnchor更改为object 2底部anc

我有一个集合视图,每个单元格都有一个文本视图。这是我的文本视图约束设置

textView.topAnchor.constraint(equalTo: object1.bottomAnchor).isActive = true
textView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
…以及我的文本视图的宽度和高度

现在,由于if条件,我想将textView的topAnchor更改为object 2底部anchor,而不是object 1底部anchor。然而,当我输入下面的代码时,我得到 将尝试通过中断约束错误进行恢复

是否有人知道一种方法,一旦设置好,就可以更改顶部锚

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

必须停用旧的活动约束。现在,您只是在视图中添加新约束。因此,首先我建议您创建两个属性,以保留对约束的引用:

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.2:如果要同时激活多个约束,请使用
NSLayoutConstraint.activate(:)
-根据,它更有效:

通常,使用此方法比单独激活每个约束更有效

因此,例如,代替:

someConstraint1.isActive = true
someConstraint2.isActive = true
而是使用:

NSLayoutConstraint.activate([someConstraint1, someConstraint2])

这同样适用于停用约束和。

hi,如果我以编程方式添加视图并设置约束,如何执行此操作