我来补充一下楼上的回复。准确地说,SnapKit ( Auto Layout ) 的代码只是描述了约束。Auto Layout 相比传统的手动布局多了一步更新约束的操作,对应的是 updateConstraints 方法,约束代码通常要放在这里面,约束是从下到上的,所以 super 是放在最后的。这个方法被系统调用之后,View 还没有完成布局,也没有 frame 。直到 layoutSubviews 被调用,这个时候约束才会被转换成具体的 frame,布局是从上到下的,所以要先调用 super 。Auto Layout 推出之前,都是覆盖这个方法来写 frame 的。Auto Layout 推出之后,这个方法主要是用来在布局完成之后做一些操作的。
如果你想要在布局完成之前拿到一个 View 的 size,系统给你提供了三个方法,intrinsicContentSize 、sizeThatFits: 和 systemLayoutSizeFittingSize:。这三个方法具体的区别你可以去网上查,但是通常你都不会用到它们。
Auto Layout 的原理在 WWDC 2015 的时候有几节视频专门讲了,楼主有兴趣可以去找找看一下。
我帮你找好了。
https://developer.apple.com/videos/all-videos/?q=auto%20layout如果你觉得 Auto Layout 实在是太麻烦了,你也可以用我刚才说的那个开源了 FlexLayout 的 layoutBox 的另一个叫 PinLayout 的库。它是一个用 Auto Layout 的语法去直接操作 frame 的库,没有任何约束,和直接操作 frame 没有区别。这些布局库都是可以混用的,你可以一个 View 用 Auto Layout,另一个 View 用 FlexLayout,再一个 View 用 PinLayout 。layoutBox 下的两个库我都是一直在用的,写了好几个十万行以上代码的商业 App,没有任何问题,非常的稳定。