自动布局:ViewDidAppear 中的帧大小不正确

Posted

技术标签:

【中文标题】自动布局:ViewDidAppear 中的帧大小不正确【英文标题】:Autolayout: Incorrect frame sizes in ViewDidAppear 【发布时间】:2015-02-01 09:36:29 【问题描述】:

我有一个 UIViewController,我通过 IB 使用 Autolayout 来定位和调整它的子视图。

由于某种原因,我没有得到正确的 UIView 布局,因此我决定在 VC 中记录所有子视图大小。

我在以下位置记录了子视图大小:

viewDidLoad
   self.view.layoutIfNeeded()
   print(uiview.size)


viewDidLayoutSubviews
 print(uiview.size)

viewWillAppear
 print(uiview.size)


viewDidAppear
 print(uiview.size)

子视图大小正确:

    viewDidLoad viewDidLayoutSubviews viewWillAppear viewDidLayoutSubviews

但它变得不正确:

    viewDidLayoutSubviews viewDidAppear

如何使用 ViewWillAppear 中的正确子视图大小?为什么我在最终 viewDidLayoutSubviews 调用和 viewDidAppear 中的尺寸不正确?

【问题讨论】:

【参考方案1】:

您的“正确尺寸”来自 AutoLayout 完成工作之前。框架将是 Interface Builder 文档中的框架。您需要修复约束以实现您期望的任何帧。

直到 viewDidAppear 之前的最终 viewDidLayoutSubviews 调用之后,AutoLayout 才完成。

【讨论】:

如果是这种情况,那么在达到 viewDidAppear 之前,自动布局如何达到正确的帧大小。此外,我的约束是正确的,我 100% 肯定。 最终的 viewDidLayoutSubviews 和 viewDidAppear 是看到 AutoLayout 完成的帧的唯一正确位置。 viewWillAppear 为时过早。检查控制台并确保没有违反约束。 这里有一个关于viewDidLoad/viewWillAppear/viewDidAppear ***.com/questions/26275116/…的答案供您参考 @bjtitus,我怎么知道是不是viewDidAppear之前的最终viewDidLayoutSubviews?【参考方案2】:

我解决了我自己的问题。

我限制视图与 VC 的高度成正比。

我正在显示的 VC 有一个导航栏。所有视图大小都是正确的,(即使在 viewDidLoad 中,因为我调用 layoutIfNeeded()),直到 VC 开始绘制导航栏并缩小 Superview 的高度;因此,缩小其子视图的高度。

我所要做的就是通过在 VC 的 Attributes Inspector 中勾选相应的框来扩展顶部栏下方的边缘。这样 VC 就不会缩小我的子视图的父视图。

【讨论】:

以上是关于自动布局:ViewDidAppear 中的帧大小不正确的主要内容,如果未能解决你的问题,请参考以下文章

自动布局:无法获取 UICollectionViewCell 子视图的帧大小

我们可以在 iOS 6 自动布局生成的帧上产生 CGRectIntegral 的效果吗?

当自动布局约束在视图控制器生命周期中设置框架?

UIScrollView 不使用自动布局滚动(内容视图框架大小以编程方式更改)

UISplitViewController viewDidAppear 中的主视图帧大小

UIButton 的帧大小何时最终设置