我有这段代码,基于元素可见性的改变约束:
if (self.collectionView.isHidden){
controller.view.bottomAnchor.constraint(equalTo: self.collectionView.topAnchor).isActive = false
controller.view.bottomAnchor.constraint(equalTo: self.view2.topAnchor).isActive = true
}
else {
controller.view.bottomAnchor.constraint(equalTo: self.collectionView.topAnchor).isActive = true
controller.view.bottomAnchor.constraint(equalTo: self.view2.topAnchor).isActive = false
}
如果我在 collectionView.isHidden
之后执行此操作设置为真,它有效。但是,在我设置 collectionView.isHidden = true
之后并调用此代码,它不再有效并且 controller.view
仍然附加到 view2 的顶部。
collectionView
也有一个高度限制。 ant ist 值为 50。
我也试过手动设置 collectionView.frame.size.height = 50
(或其他一些默认值)因为没有这个,高度为 collectionView.frame.size.height
为零。但不起作用。我试过打电话collectionView.updateConstraints()
, 但它也没有效果。
最佳答案
因此,我认为您每次调用该函数时都设置了一个新的约束条件,您并没有真正删除之前的约束条件。
通常,当我需要这种逻辑时,我会保留对约束的引用,以便稍后激活/停用它,如下所示:
var controllerBottomAnchor: NSLayoutConstraint?
然后我这样赋值:
controllerBottomAnchor = controller.view.bottomAnchor.constraint(equalTo: self.collectionView.topAnchor)
controllerBottomAnchor?.isActive = true
一旦我需要更改它,我只需使用引用:
controllerBottomAnchor?.isActive = false
我通常将它用于宽度和高度 anchor 。
关于iOS - 运行时更改约束仅在第一次起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44851764/