从 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 = NO
和 redView.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];
}
我有两个视图,一个可见(灰色) 和 一个隐藏(红色).可见视图被约束到 superview
顶部,常数为 32
,另一个约束到 superview
顶部,常数为 16
。
可见视图的顶部也被约束到隐藏视图的底部,常数为8
。此约束的优先级为 749
,因为它最初是不可满足的。
想法是可见(灰色)视图通常应在父视图下方 32 点,但是当隐藏(红色)视图可见时,原始(灰色)视图应在另一个视图下方 8 点(红色的)。
我通过保持对 32
点约束的强引用并使其成为 active/inactive 因为我是 hiding/unhiding 视图(红色)来实现这一点。
这是我的布局图片:
这在正常情况下工作得很好,但我一直在尝试在 viewDidLoad
中设置 constraint.active = NO
和 redView.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];
}