UIView - 生命周期

一般情況都是說UIViewController的生命周期,UIView的生命周期經(jīng)常被忽視。

1.沒有子控件的UIView

顯示過程:

//(superview)
- (void)willmovetosuperview:(nullable UIView *)newSuperview
- (void)didmovetosuperview

//(window)
- (void)willmovetowindow:(nullable UIWindow *)newWindow
- (void)didmovetowindow

- (void)layoutsubviews

移出過程:

//(window)
- (void)willmovetowindow:(nullable UIWindow *)newWindow
- (void)didmovetowindow

//(superview)
- (void)willmovetosuperview:(nullable UIView *)newSuperview
- (void)didmovetosuperview

- (void)removeFromSuperview
- (void)dealloc

但是在移出時(shí)newWindow和newSuperview 都是nil。

2.包含子控件的UIView

當(dāng)增加一個(gè)子控件時(shí),就會執(zhí)行 didaddsuperrview,之后也會執(zhí)行一次layoutsubview。
在view釋放后,執(zhí)行完,dealloc就會多次執(zhí)行willremovsubview.先add的view,先釋放掉。

3.layoutsubview

在上面的方法中,經(jīng)常發(fā)現(xiàn)layoutsubview會被調(diào)用,下面說下layoutsubview的調(diào)用情況:
1、addSubview會觸發(fā)layoutSubviews,如果addSubview 如果連續(xù)2個(gè) 只會執(zhí)行一次,具體原因下面說。
2、設(shè)置view的Frame會觸發(fā)layoutSubviews,必須是frame的值設(shè)置前后發(fā)生了變化。
3、滾動一個(gè)UIScrollView會觸發(fā)layoutSubviews。
4、旋轉(zhuǎn)Screen會觸發(fā)父UIView上的layoutSubviews事件。
5、改變一個(gè)UIView大小的時(shí)候也會觸發(fā)父UIView上的layoutSubviews事件。

***TIP

  1. 如果要立即執(zhí)行l(wèi)ayoutsubview,
    要先調(diào)用[view setNeedsLayout],把標(biāo)記設(shè)為需要布局.
    然后馬上調(diào)用[view layoutIfNeeded],實(shí)現(xiàn)布局.

其中的原理是:執(zhí)行setNeedsLayout后會在receiver標(biāo)上一個(gè)需要被重新布局的標(biāo)記,在系統(tǒng)runloop的下一個(gè)周期自動調(diào)用layoutSubviews。
這樣刷新會產(chǎn)生延遲,所以我們需要馬上執(zhí)行l(wèi)ayoutIfNeeded。就會開始遍歷subviews的鏈,判斷該receiver是否需要layout。如果需要立即執(zhí)行l(wèi)ayoutsubview

  1. addSubview

每一個(gè)視圖只能有唯一的一個(gè)父視圖。如果當(dāng)前操作視圖已經(jīng)有另外的一個(gè)父視圖,則addsubview的操作會把它先從上一個(gè)父視圖中移除(包括響應(yīng)者鏈),再加到新的父視圖上面。

并且連續(xù)2次的addSubview,只會執(zhí)行一次layoutsubview。因?yàn)橐淮蔚膔unLoop結(jié)束后,如果有需要刷新,執(zhí)行一次即可。

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

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

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