【问题标题】:UIView position does not respect NSLayoutConstraint when altered from viewDidLoad从 viewDidLoad 更改时,UIView 位置不尊重 NSLayoutConstraint
【发布时间】:2015-07-22 21:10:44
【问题描述】:

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

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

这个想法是可见(灰色)视图通常应该比父视图低 32 点,但是当隐藏(红色)视图变为可见时,原始(灰色)视图应该比另一个视图(红色)低 8 点)。

我通过保持对32-point 约束的强烈引用来实现这一点,并在我隐藏/取消隐藏视图(红色)时使其处于活动/非活动状态。

这是我的布局图片:

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

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

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

【问题讨论】:

    标签: ios objective-c nslayoutconstraint autolayout


    【解决方案1】:

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

    【讨论】:

    • 谢谢,在viewDidLayoutSubviews 中进行布局可以解决问题。感谢您为我指明了正确的方向,我已经坚持了太久了!
    【解决方案2】:

    使用自动布局时 - (void)viewDidLoad 将返回您在情节提要中提供的帧。

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

    - (void)viewDidLayoutSubviews {
        [super viewDidLayoutSubviews];
    
        //Replace self.view by your view whose constraints need to update
        [self.view layoutIfNeeded];
    }
    

    【讨论】:

    • 仅仅从viewDidLayoutSubviews 调用layoutIfNeeded 是不够的,因为我对viewDidLoad 中的constraint 所做的更改尚未注册。正如Hiren 指出的那样,正确的程序是直接从viewDidLayoutSubviews 完成所有布局任务。不过,您提出的观点是正确的!
    猜你喜欢
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    • 1970-01-01
    • 2019-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多