AutoLayout:UIView中的UIView框架不正确

hel*_*boy 6 cocoa-touch uiview ios uistoryboard autolayout

我在Storyboard中使用AutoLayout,一切似乎都很顺利.但是,当我将一个UIView放在另一个UIView中并将我想要的所有约束应用于容器及其子容器时,我注意到框架不正确viewDidLayoutSubviews:.考虑到我的约束,它不是我期望计算的框架,而是一些令人作呕的大框架(尽管是正确的起源).例如,而不是{{26,10},{444,10}}的框架,我得到类似{{0,0},{320,568}}的内容.

奇怪的是,这只发生在孩子UIView上,当我把它放在另一个UIView中时,它的超级视图(这是视图控制器的视图)有一些约束应用于它.由于我的印象是我可以根据我在方法中的约束条件正确地构建我的观点viewDidLayoutSubviews:,所以我很困惑为什么会发生这种情况.

我做出了不正确的假设吗?如果有人帮我指出正确的方向,我将不胜感激.谢谢!

注意:如果我依赖于正确的帧依赖设置viewDidAppear:,这个问题就完全解决了,但对我来说这是一个有点不太令人满意的解决方法.

Mik*_*and 20

自动布局更改为边界不一定完成-viewDidLayoutSubviews.如"高级自动布局工具箱"中所示:

基于约束的布局是一个迭代过程.布局传递可以基于先前的布局解决方案更改约束,这再次触发在另一布局传递之后更新约束.

-viewDidLayoutSubviews 重点在原文中的注释文档:

但是,调用此方法并不表示已调整视图子视图的各个布局.

因此,子视图中基于布局和约束的迭代可以继续调整它们的帧,但是如果ViewController的视图边界没有改变,-viewWillLayoutSubviews则不会调用它.

既然你说你的设置是"框架相关的",你有几个选择.

  1. 你的设置-viewWillAppear.优于-viewDidAppear,并且因为你真的需要在所有布局完成之后但在它出现在屏幕之前完成所有事情,这是该方法存在的合理原因.如果相关,您可以尝试-isMovingToParentViewController 按照确定视图外观更改的原因进行调用.
  2. 调用-layoutIfNeeded所需的视图,以便在需要的地方获得正确的值.因为这样做布局工作它很昂贵,并且如果在其自己的布局过程中触发,它可能导致重复工作或甚至无限循环.但是如果需要将某些值与自动布局同步以便可以使用它,那么它很有用.

如果这不起作用让我们知道,它可能与约束本身的性质或其他东西有关.自动布局迭代可能很难与之同步.祝好运.

  • `layoutIfNeeded`在我的案例中有所帮助 (7认同)