相关方法
- (CGSize)sizeThatFits:(CGSize)size -
(void)sizeToFit
——————-
- (void)layoutSubviews
- (void)layoutIfNeeded
- (void)setNeedsLayout
——————–
- (void)setNeedsDisplay
- (void)drawRect
layoutSubviews调用的情况:
1.init初始化不会付出layoutSubviews,但是用initWithFrame初始化时,当rect不为.zero时,也会触发。
2.addsubViews会触发
3.设置view的frame时会触发,前提是frame和之前的frame不同
4.滚动UIScrollView会触发
5.旋转screen时会触发父UIView上的layoutSubviews
6.改变一个UIView的大小时会触发父UIView的layoutSubviews
layoutSubviews, subviews当我们在某个类的内部调整子视图位置时,需要调用。即如果你想要在外部设置subviews的位置,就不要重写。
刷新子对象布局
-layoutSubview:默认没有做任何事情,需要子类进行重写
-setNeedslayout:标记为需要重新布局,异步调用layoutIfneeded刷新布局,不会立即刷新,但一定会调用layoutSubviews
-layoutIfNeeded:如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)
备注:setNeedsLayout方法并不会立马刷新,立即刷新需要调用layoutIfNeeded。
如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded]实现布局。
setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews.
layoutIfNeeded UIKit会判断该receiver是否需要layout,遍历的不是superview链,二十subviews
在视图第一次显示之前,标记总是“需要刷新”,可以直接调用[view layoutIfNeeded]。