Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/asp.net-mvc-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 当从viewDidLoad更改时,UIView位置不符合NSLayoutConstraint_Ios_Objective C_Nslayoutconstraint_Autolayout - Fatal编程技术网

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
中进行布局可以解决这个问题。谢谢你给我指出了正确的方向,我已经在这上面停留太久了!