Ios 当从viewDidLoad更改时,UIView位置不符合NSLayoutConstraint
我有两个视图,一个可见(灰色)和一个隐藏(红色)。可见视图约束到Ios 当从viewDidLoad更改时,UIView位置不符合NSLayoutConstraint,ios,objective-c,nslayoutconstraint,autolayout,Ios,Objective C,Nslayoutconstraint,Autolayout,我有两个视图,一个可见(灰色)和一个隐藏(红色)。可见视图约束到超级视图顶部,常数为32,另一个约束到超级视图顶部,常数为16 可见视图的顶部也约束到隐藏视图的底部,常数为8。此约束的优先级为749,因为它最初不可满足 其想法是,可见(灰色)视图通常应比超级视图低32点,但当隐藏(红色)视图变为可见时,原始(灰色)视图应比其他视图(红色)低8点 我通过保持对32-点约束的强引用,并在隐藏/取消隐藏视图时使其处于活动/非活动状态(红色)来实现这一点 这是我的布局图: 这在正常情况下工作得很好,但
超级视图
顶部,常数为32
,另一个约束到超级视图
顶部,常数为16
可见视图的顶部也约束到隐藏视图的底部,常数为8
。此约束的优先级为749
,因为它最初不可满足
其想法是,可见(灰色)视图通常应比超级视图低32点,但当隐藏(红色)视图变为可见时,原始(灰色)视图应比其他视图(红色)低8点
我通过保持对32
-点约束的强引用,并在隐藏/取消隐藏视图时使其处于活动/非活动状态(红色)来实现这一点
这是我的布局图:
这在正常情况下工作得很好,但我一直在尝试在viewDidLoad
中设置constraint.active=NO
和redView.hidden=NO
,因为如果未满足某个条件,我需要文本字段来显示错误。出于某种原因,这是行不通的。红色视图按预期显示,但第二个视图(灰色)没有按预期向下移动(它不符合749
约束,即使主约束不再处于活动状态)。下面是结果的图片:
但是,我让代码在一个小延迟后(使用dispatch_after();
)禁用约束并显示视图,然后它突然按预期工作:
我的问题是:当视图从
viewDidLoad
立即运行时,为什么视图不尊重约束并向下移动?为什么在一个小小的延迟之后它突然工作了?如果我能让它正常工作,这是实现我目标的一个不错的解决方案吗?在viewDidLayoutSubviews方法中调用它,而不是在viewdidload中调用它。
自动布局加载它需要一些时间,因此在viewDidLayoutSubviews中调用它。在viewDidLayoutSubviews方法中调用它而不是在viewdidload中。
自动布局加载它需要一些时间,因此在viewDidLayoutSubviews中调用它。在viewDidLayoutSubviews方法中调用它而不是在viewdidload中。
自动布局加载它需要一些时间,因此在viewDidLayoutSubviews中调用它。在viewDidLayoutSubviews方法中调用它而不是在viewdidload中。
自动布局加载需要一些时间,因此在viewDidLayoutSubviews中调用它。使用自动布局时-(无效)viewDidLoad将返回您在故事板中提供的帧 必须使用-(void)viewDidLayoutSubviews根据约束更新框架
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//Replace self.view by your view whose constraints need to update
[self.view layoutIfNeeded];
}
在使用autolayout-(void)时,viewDidLoad将返回您在故事板中给出的帧 必须使用-(void)viewDidLayoutSubviews根据约束更新框架
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//Replace self.view by your view whose constraints need to update
[self.view layoutIfNeeded];
}
在使用autolayout-(void)时,viewDidLoad将返回您在故事板中给出的帧 必须使用-(void)viewDidLayoutSubviews根据约束更新框架
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//Replace self.view by your view whose constraints need to update
[self.view layoutIfNeeded];
}
在使用autolayout-(void)时,viewDidLoad将返回您在故事板中给出的帧 必须使用-(void)viewDidLayoutSubviews根据约束更新框架
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//Replace self.view by your view whose constraints need to update
[self.view layoutIfNeeded];
}
仅从
viewdilayoutsubviews
调用layoutifneed
是不够的,因为我在viewdiload
中对约束所做的更改尚未注册。正如Hiren指出的,正确的步骤是直接从viewdilayoutsubviews
执行所有布局任务。不过,你的观点是正确的!仅从viewdilayoutsubviews
调用layoutifneed
是不够的,因为我在viewdiload
中对约束所做的更改尚未注册。正如Hiren指出的,正确的步骤是直接从viewdilayoutsubviews
执行所有布局任务。不过,你的观点是正确的!仅从viewdilayoutsubviews
调用layoutifneed
是不够的,因为我在viewdiload
中对约束所做的更改尚未注册。正如Hiren指出的,正确的步骤是直接从viewdilayoutsubviews
执行所有布局任务。不过,你的观点是正确的!仅从viewdilayoutsubviews
调用layoutifneed
是不够的,因为我在viewdiload
中对约束所做的更改尚未注册。正如Hiren指出的,正确的步骤是直接从viewdilayoutsubviews
执行所有布局任务。不过,你的观点是正确的!谢谢,在viewdlayoutsubviews
中进行布局可以解决这个问题。谢谢你给我指出了正确的方向,我已经在这上面停留太久了!谢谢,在viewdlayoutsubviews
中进行布局可以解决这个问题。谢谢你给我指出了正确的方向,我已经在这上面停留太久了!谢谢,在viewdlayoutsubviews
中进行布局可以解决这个问题。谢谢你给我指出了正确的方向,我已经在这上面停留太久了!谢谢,在viewdlayoutsubviews
中进行布局可以解决这个问题。谢谢你给我指出了正确的方向,我已经在这上面停留太久了!