【发布时间】:2015-02-14 04:02:52
【问题描述】:
我在 IB 中设置了多组约束,我想根据某些状态以编程方式在它们之间切换。有一个constraintsA outlet 集合,所有这些集合都标记为从 IB 安装,还有一个 constraintsB outlet 集合,所有这些集合都在 IB 中被卸载。
我可以像这样以编程方式在两组之间切换:
NSLayoutConstraint.deactivateConstraints(constraintsA)
NSLayoutConstraint.activateConstraints(constraintsB)
但是...我不知道什么时候可以这样做。似乎我应该能够在viewDidLoad 中做到这一点,但我无法让它发挥作用。设置约束后,我尝试调用view.updateConstraints() 和view.layoutSubviews(),但无济于事。
我确实发现,如果我在 viewDidLayoutSubviews 中设置约束,一切都会按预期工作。我想我想知道两件事......
- 为什么会出现这种行为?
- 是否可以从 viewDidLoad 激活/停用约束?
【问题讨论】:
-
你的意思是deactivateConstraints和activateConstraints在viewWillLayoutSubviews中工作吗?我试过了,但它在那里或 viewDidLoad 中都不起作用。它在 viewDidAppear 中起作用;视图出现在新约束应该放置的位置,但是如果我旋转到横向,视图会移回由 IB 中设置的约束确定的位置(并在我旋转回纵向时停留在那里)。记录约束,显示正确的约束(新激活的约束)。这对我来说似乎是一个错误。
-
是的,它们是有效的(它们在 viewDidAppear 中工作),并且没有必要调用 super,因为没有 viewWillLayoutSubviews 的默认实现(无论如何我尝试调用 super,但这没有区别) .
-
@rdelmar 刚刚有机会进行更多测试...我可以验证我实际上得到了您描述的相同行为...最初在 viewDidAppear 中有效,但随后在轮换时恢复。
-
显然您不能为此目的将约束标记为未在 IB 中安装。在此处找到该信息:stackoverflow.com/questions/27663249/…,它为我解决了问题。
-
我的约束实现方式与问题中描述的相同,但我在 viewDidAppear 中激活/停用了其中的一些。这行得通,但是您可以看到元素迅速改变位置(一个小但不受欢迎的问题)。在 viewWillAppear 或 viewDidLoad 中进行更改不起作用。但是在阅读了这个问题之后,我尝试在 viewDidLayoutSubviews 中进行更改。它起作用了,用户不再看到位置变化。 (它也适用于 viewWillLayoutSubviews)。所以谢谢你的提示!
标签: ios swift uiview autolayout nslayoutconstraint