layout机制相关方法总结

以下是iOS layout机制常用的相关方法:

*  layoutSubviews:对subviews重新布局,这个方法,默认没有做任何事情,需要子类进行重写。该方法调用先于drawRect

*  layoutIfNeeded:方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded遍历的不是superview链,应该是subviews链

* setNeedsLayout:在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

* setNeedsDisplay:标记为需要重绘,异步调用drawRect,即在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘

* setNeedsDisplayInRect:(CGRect)invalidRect:标记为需要局部重绘

* drawRect:重写此方法,对receiver执行重绘任务,能获得context

* sizeThatFits:传入的参数是receiver当前的size,返回一个适合的size

* sizeToFit:可以被手动直接调用 ,不应该在子类中被重写,会自动调用sizeThatFits方法,应该重写sizeThatFits

【注】

(1)、sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

(2)、如果要立即刷新,要先调用[view setNeedsLayout],把标记设为需要布局,然后马上调用[view layoutIfNeeded],实现布局

(3)、在视图第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]


layoutSubviews在以下情况下被调用:

1、init初始化不会触发layoutSubviews,但是用initWithFrame进行初始化时,当rect的值不为CGRectZero时,就会触发layoutSubviews方法;

2、当调用addSubview会触发layoutSubviews方法;

3、设置view的frame值,且设置前后frame的值发生了变化;

4、滚动UIScrollView时,会触发layoutSubviews方法;

5、旋转Screen会触发父UIView上的layoutSubviews方法;

6、改变UIView大小的时候,也会触发layoutSubviews方法;

【注】

(1)、setNeedsLayout方法: 标记为需要重新布局,异步调用layoutIfNeeded刷新布局,不立即刷新,但layoutSubviews一定会被调用

(2)、layoutIfNeeded方法:如果有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

推荐阅读更多精彩内容