layoutSubview的調(diào)用時機分析

  1. 在初始化時,調(diào)用init 和-(instancetype)initWithFrame:(CGRect)frame 當(dāng)frame為CGRectZero是不會調(diào)用的。
  2. 在調(diào)用addSubView時,這個跟添加的subView尺寸大小沒有關(guān)系。同時初始化尺寸不為0,則會調(diào)用兩次layoutSubview方法。
view和子view的layoutSubviews方法會調(diào)用, 并且是先調(diào)用View的layoutSubviews方法在調(diào)用子view的, 而且就算是添加多個子view,那么view的layoutSubviews也只會調(diào)用一次, 而不是調(diào)用多次

3.改變View的frame時,但是,此時設(shè)置的frame 和之前的View的frame不一樣,才會調(diào)用

  1. 當(dāng)視圖是UIScrollView時,發(fā)生滾動時,也會調(diào)用layoutSubviews
  2. 當(dāng)屏幕發(fā)生旋轉(zhuǎn)時
  3. 當(dāng)前view調(diào)用了setNeedsLayout方法時,會異步調(diào)用layoutSubviews

setNeedsLayout 和 layoutIfNeeded

調(diào)用view的setNeedsLayout方法時,這時候會觸發(fā)該view的layoutSubviews方法的調(diào)用,這里需要是一一對應(yīng)的關(guān)系,那個view調(diào)用setNeedsLayout方法就觸發(fā)哪個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.
您不應(yīng)該直接調(diào)用此方法。如果你想強制一個布局更新,調(diào)用setNeedsLayout方法,而不是在下一次繪圖更新之前這樣做。如果您想立即更新視圖的布局,請調(diào)用layoutIfNeeded方法。

所以調(diào)用了setNeedsLayout一定會觸發(fā)layoutSubviews,但是layoutIfNeeded會根據(jù)是否有刷新標(biāo)記,來決定是否刷新(setNeedsLayout是設(shè)置標(biāo)記,layoutIfNeeded根據(jù)標(biāo)記立即刷新,所以連續(xù)調(diào)用兩個方法會立即刷新)。
[self setNeedsLayout];
[self layoutIfNeeded]; //有刷新標(biāo)記則立刻調(diào)用layoutSubviews,沒有則不調(diào)用

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容