从 viewDidLoad 更改时,UIView 位置不遵守 NSLayoutConstraint

UIView position does not respect NSLayoutConstraint when altered from viewDidLoad

我有两个视图,一个可见(灰色) 一个隐藏(红色).可见视图被约束到 superview 顶部,常数为 32,另一个约束到 superview 顶部,常数为 16

可见视图的顶部也被约束到隐藏视图的底部,常数为8。此约束的优先级为 749,因为它最初是不可满足的。

想法是可见(灰色)视图通常应在父视图下方 32 点,但是当隐藏(红色)视图可见时,原始(灰色)视图应在另一个视图下方 8 点(红色的)。

我通过保持对 32 点约束的强引用并使其成为 active/inactive 因为我是 hiding/unhiding 视图(红色)来实现这一点。

这是我的布局图片:

这在正常情况下工作得很好,但我一直在尝试在 viewDidLoad 中设置 constraint.active = NOredView.hidden = NO,因为我需要文本字段在特定条件下显示错误没有遇到过。出于某种原因,这不起作用。红色视图按预期显示,但第二个视图(灰色)没有按预期向下移动(它不遵守 749 约束,即使主约束不再处于活动状态)。这是结果的图片:

但是,我编写了代码以停用约束并在一小段延迟后显示视图 运行(使用 dispatch_after();),然后它突然按预期工作:

我的问题是:为什么视图不遵守约束并立即从 viewDidLoad 运行 向下移动?为什么它在一小段延迟后突然起作用?如果我可以让它正常工作,这是实现我的目标的一个不错的解决方案吗?

在 viewDidLayoutSubviews 方法中调用它,而不是在 viewdidload 中调用它。 autolayout 它需要一些时间来加载所以在 viewDidLayoutSubviews 中调用它。

使用自动布局时 - (void)viewDidLoad 将 return 您在情节提要中提供的框架。

您必须使用 - (void)viewDidLayoutSubviews 根据约束更新框架。

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    //Replace self.view by your view whose constraints need to update
    [self.view layoutIfNeeded];
}