layoutSubview的调用时机分析

2023-02-22  本文已影响0人  中秋梧桐语
  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,没有则不调用

上一篇下一篇

猜你喜欢

热点阅读