iOS Auto Layout UIView 绘制周期

Posted

技术标签:

【中文标题】iOS Auto Layout UIView 绘制周期【英文标题】:iOS Auto Layout UIView Drawing cycle 【发布时间】:2015-04-26 04:16:38 【问题描述】:

在其中一个 WWDC 视频中,Apple 表示布局是从上到下完成的,即从父视图到子视图(在从下向上计算约束之后)。显示也是自上而下的。

我的问题是: 1. 在 vi​​ewcontroller 中的哪个点确定视图的框架(原点和大小)?我尝试记录视图的大小(使用自动布局定义),但它始终为 0 0 0 0,这很奇怪,因为视图已经在模拟器中生成;

对于自动调整大小的视图,view.frame 何时可用?

    同样的问题,除了这次是 UIImageView.frame。我尝试登录到控制台,即使大小符合约束条件,记录的 UIImageView 帧也是 0 0 width_of_original_image height_of_original_image。但对于标签等其他视图,框架会在控制台上正确打印。

似乎有一个神秘的自动布局引擎执行转换,没有人知道引擎内部发生了什么,但检查模拟器显示的内容以了解该引擎如何渲染视图???

【问题讨论】:

【参考方案1】:

这并不神秘。这很简单!将约束视为写在纸上的说明——视图。每隔一段时间,它的布局时间!运行时按顺序从视图中收集纸片并遵守它们 - 因此您最终会得到布局框架。

因此,如果您在布局时间之前检查事物的大小,您会得到错误的答案,因为它还没有发生。

而当布局时间?每当运行时发送视图layoutSubviews - 事实上,运行时遵守约束并执行布局 layoutSubviews。你的视图控制器可以在之前或之后通过viewWillLayoutSubviewsviewDidLayoutSubviews 听到这一点。

我认为最让初学者感到困惑的部分是当视图控制器出现时会发生什么。 viewDidLoad 表示它一个视图,但仅此而已;视图及其子视图都不在界面中,因此显然不能有布局。 稍后,我们得到viewWillAppear:,视图进入界面,现在我们得到布局。因此,如果您检查尺寸,例如 viewDidAppear:,它们将是正确的。

【讨论】:

看看我的书:apeth.com/iosBook/ch14.html#_order_of_layout_events 和 apeth.com/iOSBook/ch19.html#_view_controller_lifetime_events 这些是否相同:属性:NSLayoutAttributeCenterX relatedBy:0 toItem:self.view 属性:NSLayoutAttributeLeft 乘数:1 常数:self.otherView.center.x]] 与属性:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem :self 属性:NSLayoutAttributeCenterX 乘数:1.0 常数:0.0]];

以上是关于iOS Auto Layout UIView 绘制周期的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 6 中使用 Auto Layout 在 superview 中均匀分布相同大小的 UIView

使用 Auto Layout 改变 UIButtons 的 Column 布局

ios UITableView设置tableHeaderView时发生约束错误 UIView-Encapsulated-Layout-Height UIView-Encapsulated-Layout

iOS 开发实践之 Auto Layout

iOS之Xcode8 Auto Layout新特性

Interface Builder:UIView 的 Layout iOS 6/7 Delta 有啥用?