We Simplify, But We Perfect.


AutoLayout 背后的秘密

2015-11-27


我们先看一个 Layout 的周期

项目以 Run Loop 的形式启动,当约束发生改变的时候,Layout Engine 会重新计算 Layout,之后到 Deferred Layout Pass, 最后,所有的布局完成

约束的改变包括了下面几个方面:

当收到约束改变的通知以后,Engine 做的第一件事情就是重新计算 Layout,这里我猜想是计算包括优先级在内以及 instrinsicContentSize 的有效的约束,以及排除一些无效的约束,当 Layout Engine 收到新的值以后,会调用 superView 的 setNeedsLayout 方法,通知 superView 重新布局。这也就是为什么会导致延迟布局的原因。


最后一步是 Deferred Layout Pass, 这一步过后,所有 view 的 frame 将被重新布局完毕,

Deferred Layout Pass 包含了 2 个步骤

完成 Layout 的布局以后,将 subview 的 frame 从 Layout Engine 中拷贝出来给视图,并且从父类开始,向下调用 layoutSubview() 方法

WWDC 中还强调,最好不要去重写 layoutSubviews(), 如果你真的要这么做,那么你需要注意这么几件事情:

整个 layout cycle 需要注意的两个事项:



上一篇:Xcode下调试神奇——Chisel 下一篇:制作自己的 CocoaPods