我有一个简单(我认为如此)的问题:我有一个UIImageView
,在Storyboard中已经设置多个约束。
有时,我需要禁用这些约束,并手动设置其frame
,但稍后,我想重新启用这些约束,并使视图返回到由约束决定的位置。
我以为可以通过类似以下的方法实现:
@IBOutlet weak var imageView: UIImageView!
@IBOutlet weak var constraint: NSLayoutConstraint!
func example() {
//to set its location and size manually
imageView.removeConstraint(constraint)
imageView.frame = CGRectMake(...)
//to cause it to return to its original position
imageView.addConstraint(constraint)
}
然而,我遇到了这个错误:2015-08-26 01:14:55.417 Constraints[18472:923024] The view hierarchy is not prepared for the constraint: <NSLayoutConstraint:0x7fbb72815f90 V:[_UILayoutGuide:0x7fbb72814c20]-(100)-[UIImageView:0x7fbb72814540]>
。有人知道为什么会出现这个错误吗?
通过调用self.view.addConstraint(...)
将约束添加到view
中可以消除错误,但仍无法将图像视图放回其原本的位置。
我注意到,我甚至不必删除或取消激活约束就能够轻松设置imageView
的框架,只要不调用setTranslatesAutoresizingMaskIntoConstraints(true)
即可。
我已经看过这个问题,但答案似乎过于复杂,也许已经过时,甚至不适用。
我还看到了这个问题,但它只覆盖了如何禁用约束--没有涉及如何重新启用它们。
尝试设置active
属性:
self.top.active = false
self.right.active = false
self.bottom.active = false
self.left.active = false
imageView.frame = CGRectMake(100, 100, 100, 100)
这实际上只是导致imageView
不再可见。 (但如果我不将所有约束的active
属性设置为false,则imageView
会移动到正确的位置。
然而,真正的问题是,当我尝试通过将所有约束的active
属性设置为true来使图像视图返回原位时,什么都没有发生——imageView仍停留在原地(在本例中由imageView.frame = CGRectMake(100, 100, 100, 100)
指定)。
此外,根据我的测试和Joachim Bøggild在这里的答案,当约束的active
属性设置为false时,该约束变为nil,因此无法重新激活。
将约束添加到数组并激活/停用它们:
有趣的是,这几乎与设置active
属性完全相同。将所有约束放入一个数组array
,然后调用NSLayoutConstraint.deactivateConstraints(array)
将使图像视图消失。此外,稍后使用NSLayoutConstraint.activateConstraints(array)
重新激活约束并不能使图像视图返回到应该在的位置——它仍停留在原地。
IBOutlet
强引用:只需删除weak
关键字,然后你的引用就是强引用了! - LinusGeffarth