Layout相关
-
UIView(UIViewHierarchy)
- setNeedsLayout (标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用)
- layoutIfNeeded (有需要刷新的标记,立即调用layoutSubviews进行布局)
- layoutSubviews (默认不做什么处理,重写内部改变布局)
-
UIView(UIViewRendering)
- setNeedsDisplay (异步调用drawRect方法进行重绘)
- drawRect (重绘)
-
UIView(UIViewGeometry)
- sizeToFit (会自动调用sizeThatFits方法,改变size 会调用 drawRect)
- sizeThatFits (需要子类重写,receiver当前的size,返回一个适合的size)
-
UIViewController
viewWillLayoutSubviews
viewDidLayoutSubviews
在controller的的子视图的position和size被改变的时候被调用,关键点是改变边界。任何依赖于bounds,并且需要去完成的操作都应该放在viewDidLayoutSubviews中,而不是viewDidLoad或viewWillAppear中。因为 view的frame和bounds直到Auto Layout 完成才能够确定;
AutoLayout生效时,ViewController在干什么?
- 任何原因引起View的尺寸被改变
- 调用ViewController的“viewWillLayoutSubviews”方法
- 未启用Autolayout情况,调用“layoutSubviews”
- 启用Autolayout情况,调用ViewController的"updateViewConstraints"方法。在这个方法里,会调用所有subview的“updateConstraints”方法。
- 当界面被刷新后,调用ViewController的“viewDidLayoutSubviews”。(这时候获取到的 UIView 的Frame 就是界面显示的 Size)
Constraint
Constraints must be added after adding views to their superviews. All constraints need to be in the same hierarchy. If they aren’t, the app will immediately crash.
In viewDidLoad() setupFrame with setupConstraints();一般的子view约束布局建议加在 viewDidLoad 中;