layoutSubview的调用时机分析

  1. 在初始化时,调用init 和-(instancetype)initWithFrame:(CGRect)frame 当frame为CGRectZero是不会调用的。
  2. 在调用addSubView时,这个跟添加的subView尺寸大小没有关系。同时初始化尺寸不为0,则会调用两次layoutSubview方法。
view和子view的layoutSubviews方法会调用, 并且是先调用View的layoutSubviews方法在调用子view的, 而且就算是添加多个子view,那么view的layoutSubviews也只会调用一次, 而不是调用多次

3.改变View的frame时,但是,此时设置的frame 和之前的View的frame不一样,才会调用

  1. 当视图是UIScrollView时,发生滚动时,也会调用layoutSubviews
  2. 当屏幕发生旋转时
  3. 当前view调用了setNeedsLayout方法时,会异步调用layoutSubviews

setNeedsLayout 和 layoutIfNeeded

调用view的setNeedsLayout方法时,这时候会触发该view的layoutSubviews方法的调用,这里需要是一一对应的关系,那个view调用setNeedsLayout方法就触发哪个view的layoutSubviews方法
官方文档描述:

You should not call this method directly. If you want to force a layout update, call the `setNeedsLayout` method instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call the `layoutIfNeeded` method.
您不应该直接调用此方法。如果你想强制一个布局更新,调用setNeedsLayout方法,而不是在下一次绘图更新之前这样做。如果您想立即更新视图的布局,请调用layoutIfNeeded方法。

所以调用了setNeedsLayout一定会触发layoutSubviews,但是layoutIfNeeded会根据是否有刷新标记,来决定是否刷新(setNeedsLayout是设置标记,layoutIfNeeded根据标记立即刷新,所以连续调用两个方法会立即刷新)。
[self setNeedsLayout];
[self layoutIfNeeded]; //有刷新标记则立刻调用layoutSubviews,没有则不调用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容