美文网首页
layoutSubview的调用时机分析

layoutSubview的调用时机分析

作者: 中秋梧桐语 | 来源:发表于2023-02-22 15:30 被阅读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,没有则不调用

    相关文章

      网友评论

          本文标题:layoutSubview的调用时机分析

          本文链接:https://www.haomeiwen.com/subject/qmcgkdtx.html