声明.剽窃自谷歌,看后瞬间理解深刻加深了原文地址
layoutSubviews 调用时机
一般baidu出来的答案如下,然而说明并不够透彻,在此补充说明:
1、init初始化不会触发layoutSubviews
2、addSubview会触发layoutSubviews
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
4、滚动一个UIScrollView会触发layoutSubviews
5、旋转Screen会触发父UIView上的layoutSubviews事件
6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件
首先:layoutSubviews 字面意思是: 布局子控件,也就是说改变子控件会调用父类该方法;
1、init初始化不会触发layoutSubviews,
这点确实不会调用;
2、addSubview会触发layoutSubviews,
如果添加的子控件没有Frame,不会调用;
3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化;
还有一个前提是该View 已经被添加到父控件, 此时View和其父控件的layoutSubviews都会调用;
也就包含了6 的情况
4、滚动一个UIScrollView会触发layoutSubviews ,因滚动UIScrollView,其子控件肯定对应会刷新,也就肯定会被调用;
这点会调用;
5、旋转Screen会触发控制器对应UIView上的layoutSubviews事件
做一点更正;
总结:改变子控件就会调用父类的方法;
参考文档这样说:
大概意思是:如果子控件的布局无法满足需求,需要对子控件更改布局时可以重写layoutSubviews 直接改变之空间的Frame; 如果需要强制更新子控件的布局, 不能直接调用layoutSubviews,应该调用setNeedsLayout;
Subclasses can override this method as needed to perform more precise layout of their subviews. You should override this method only if the autoresizing and constraint-based behaviors of the subviews do not offer the behavior you want. You can use your implementation to set the frame rectangles of your subviews directly.
You should not call this method directly. If you want to force a layout update, call thesetNeedsLayoutmethod instead to do so prior to the next drawing update. If you want to update the layout of your views immediately, call thelayoutIfNeededmethod.
逻辑教育视频合集:
链接:https://pan.baidu.com/s/1kqiOB09jXG4aGXFXWKguZw 提取码:j9Zq
如果被和谐联系:2395660048