在其中一个WWDC视频中,Apple表示布局是从上到下完成的,即从superview到subview(在从下到上计算约束后)。显示也是从上到下完成的。
我的问题是: 1.视图控制器中的哪一点确定了视图的框架(原点和大小)?我试图记录视图的大小(使用自动布局定义),但它总是0 0 0 0,这是奇数,因为视图已经在模拟器中生成;
对于自动调整的视图,view.frame何时可用?
似乎有一个神秘的自动布局引擎执行转换,没有人知道引擎内部发生了什么,但是要检查模拟器显示器上的内容,以确定该引擎如何呈现视图???
答案 0 :(得分:6)
这并不神秘。这很简单!将约束视为写在纸上的说明 - 视图。每隔一段时间,它就是布局时间!运行时按顺序从视图中收集纸张并遵守它们 - 因此您最终会得到布局框架。
因此,如果您在布局时间之前检查的大小,那么您会得到错误的答案,因为它还没有发生。
当是布局时间?每当运行时发送视图layoutSubviews
时 - 实际上,运行时服从约束并在 layoutSubviews
期间执行布局。您的视图控制器可以使用viewWillLayoutSubviews
和viewDidLayoutSubviews
之前或之后听到此消息。
我认为最让初学者困惑的部分是当视图控制器出现时会发生什么。 viewDidLoad
表示拥有一个视图,但这就是全部;视图和子视图都不在界面中,所以很明显没有布局。相当以后,我们得到viewWillAppear:
,视图进入界面,现在我们获得布局。因此,如果您检查尺寸,例如viewDidAppear:
,它们就是正确的。