自动布局: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 不使用自动布局滚动(内容视图框架大小以编程方式更改)