目的:巧妙利用UIView和UIViewController的生命周期做合適的事能夠提升界面加載的流暢度
1屉来、UIVIew狀態(tài)改變對應(yīng)的方法調(diào)用
1.1 UIView顯示過程的方法調(diào)用順序如下:
- willMoveToSuperview:
- didMoveToSuperview
- willMoveToWindow
- didMoveToWindow
- layoutSubviews
1.2 UIView銷毀過程的方法調(diào)用順序如下:
- willMoveToSuperview
- willMoveToWindow
- didMoveToWindow
- didMoveToSuperview
-
dealloc
注意:Apple建議上面這些方法不需要顯式調(diào)用漠魏,只要重寫即可塔猾。
如圖1.1 是UIView的測試和圖1.2是UIView的生命周期流程圖
圖1.1 UIView生命周期測試圖
-
2、UIViewController的生命周期
?????假設(shè)場景:存在三個UIControllerView (A囚似、B、C)线得,頁面切換如下:A進入B饶唤,在進入C,然后由C返回到B贯钩,在返回A募狂,ControllerView的跳轉(zhuǎn)示意圖如下:
2.1 A->B->C生命周期
?????如圖2.2所示:AViewController少initialize和init的方法調(diào)用呵晨,是因為在我demo測試中AViewController是UITableBar的一個item,而且不是第一個item熬尺,根據(jù)UITableBar的加載機制摸屠,只加載第一個item作為默認(rèn)(如圖2.3所示)。由圖2.2可以看出AàB的跳轉(zhuǎn)是全屏模式粱哼,在B的生命周期符合圖2.1所展示的季二,而BàC不是全屏模式。其原因是在iOS 13的模態(tài)跳轉(zhuǎn)中(如圖2.4所示)揭措,需要指定跳轉(zhuǎn)的模式胯舷,若是模式跳轉(zhuǎn)是全屏模式,開啟新的VC(我稱為子VC)覆蓋原來的VC(我成為父VC)則父VC的狀態(tài)會被系統(tǒng)設(shè)置成為不可見(Disappear)绊含。如果不是全屏模式桑嘶,即在當(dāng)前的父VC視圖是可見的,所以子VC的生命周期沒有調(diào)用父VC的(Disappear)躬充。
注:使用pushViewController: animated: 跳轉(zhuǎn)的生命周期是一樣的逃顶。主要區(qū)別新開啟的ViewController是不是全屏模式,對應(yīng)著不同的生命周期充甚。
2.2 C->B->A的生命周期
從CVC返回到BVC生命周期是:
- CViewController調(diào)用viewWillDisappear
- BViewController調(diào)用viewWillAppear
- CViewController調(diào)用viewDidDisappear
-
BViewController調(diào)用viewDidAppear
CVC返回到BVC生命周期
-
從BVC返回到AVC的生命周期是:
- BViewController調(diào)用viewWillDisappear
- AViewController調(diào)用viewWillAppear
- AViewController調(diào)用viewDidDisappear
-
BViewController調(diào)用viewDidAppear
BVC返回到AVC的生命周期
-
Tips:
當(dāng)系統(tǒng)執(zhí)行 layoutSubviews 完成后以政,會觸發(fā)ViewController的 viewDidLayoutSubviews 方法調(diào)用。因為 viewDidLayoutSubviews 是 view 布局更新后會被唯一可靠調(diào)用的方法伴找,所以我們應(yīng)該把所有依賴于布局或者大小的代碼放在 viewDidLayoutSubviews 中盈蛮,而不是放在 viewDidLoad 或者 viewDidAppear 中。這是避免使用過時的布局或者位置變量的唯一方法技矮。
再者抖誉, 新手的文章可能有誤,請指正衰倦。