gpt4 book ai didi

swift - 启用 + 禁用自动布局约束

转载 作者:IT王子 更新时间:2023-10-29 05:03:52 24 4
gpt4 key购买 nike

我有一个简单的(我认为)问题:我有一个 UIImageView ,我在 Storyboard 中为其设置了多个约束。

有时,我需要禁用约束,并设置它的 frame手动,但稍后,我想重新启用这些约束并让 View 返回到由约束决定的位置。

我想我可以用类似的东西来做到这一点:

@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]> .有谁知道为什么会出现这个错误?

将约束改为添加到 view调用self.view.addConstraint(...)消除了错误,但仍然没有将 ImageView 恢复到应有的位置。

我注意到我什至不必删除或停用约束即可设置 imageView 的框架没问题,只要我不调用setTranslatesAutoresizingMaskIntoConstraints(true) .

我已经看过 this问题,但答案似乎不必要地复杂,可能已经过时,甚至不适用。

我还看到了this问题,但这不包括可以重新启用的约束 - 仅包括如何禁用它们。

尝试设置 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 使 ImageView 返回到原来的位置时属性设置为 true,什么也不会发生——imageView 保持在原来的位置(在本例中由 imageView.frame = CGRectMake(100, 100, 100, 100) 指定。

此外,根据我的测试和 Joachim Bøggild 的回答,似乎是 here ,当约束的 active属性设置为 false,该约束变为 nil,因此无法重新激活。

向数组添加约束并激活/停用它们:

有趣的是,这会导致与设置 active 几乎完全相同的问题。属性(property)。将所有约束放在一个数组中 array , 然后调用 NSLayoutConstraint.deactivateConstraints(array)使 ImageView 消失。此外,稍后使用 NSLayoutConstraint.activateConstraints(array) 重新激活约束 ImageView 没有返回到它应该的位置——它停留在原来的位置。

最佳答案

啊哈!

一旦 active 属性设置为 false,约束就变为 nil(因此无法重新激活)。使它们成为强引用(感谢 Caleb,清理了命名法)可以保留它们,以便可以根据需要激活和停用它们。

关于swift - 启用 + 禁用自动布局约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32218495/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com