目的:巧妙利用UIView和UIViewController的生命周期做合适的事能够提升界面加载的流畅度
1、UIVIew状态改变对应的方法调用
1.1 UIView显示过程的方法调用顺序如下:
- willMoveToSuperview:
- didMoveToSuperview
- willMoveToWindow
- didMoveToWindow
- layoutSubviews
1.2 UIView销毁过程的方法调用顺序如下:
- willMoveToSuperview
- willMoveToWindow
- didMoveToWindow
- didMoveToSuperview
-
dealloc
注意:Apple建议上面这些方法不需要显式调用,只要重写即可。
如图1.1 是UIView的测试和图1.2是UIView的生命周期流程图
图1.1 UIView生命周期测试图
-
2、UIViewController的生命周期
假设场景:存在三个UIControllerView (A、B、C),页面切换如下:A进入B,在进入C,然后由C返回到B,在返回A,ControllerView的跳转示意图如下:
![](https://img.haomeiwen.com/i19476148/963cca33b5ad3f0b.png)
2.1 A->B->C生命周期
![](https://img.haomeiwen.com/i19476148/8ef03d56cb3909e5.png)
![](https://img.haomeiwen.com/i19476148/709f5516855c1fc4.png)
![](https://img.haomeiwen.com/i19476148/4dec28a9be410a1d.png)
![](https://img.haomeiwen.com/i19476148/eca85ed083fec38e.png)
![](https://img.haomeiwen.com/i19476148/aff03e42aaeecc64.png)
如图2.2所示:AViewController少initialize和init的方法调用,是因为在我demo测试中AViewController是UITableBar的一个item,而且不是第一个item,根据UITableBar的加载机制,只加载第一个item作为默认(如图2.3所示)。由图2.2可以看出AàB的跳转是全屏模式,在B的生命周期符合图2.1所展示的,而BàC不是全屏模式。其原因是在iOS 13的模态跳转中(如图2.4所示),需要指定跳转的模式,若是模式跳转是全屏模式,开启新的VC(我称为子VC)覆盖原来的VC(我成为父VC)则父VC的状态会被系统设置成为不可见(Disappear)。如果不是全屏模式,即在当前的父VC视图是可见的,所以子VC的生命周期没有调用父VC的(Disappear)。
![](https://img.haomeiwen.com/i19476148/2ae209f557272381.png)
注:使用pushViewController: animated: 跳转的生命周期是一样的。主要区别新开启的ViewController是不是全屏模式,对应着不同的生命周期。
2.2 C->B->A的生命周期
从CVC返回到BVC生命周期是:
- CViewController调用viewWillDisappear
- BViewController调用viewWillAppear
- CViewController调用viewDidDisappear
-
BViewController调用viewDidAppear
CVC返回到BVC生命周期
-
从BVC返回到AVC的生命周期是:
- BViewController调用viewWillDisappear
- AViewController调用viewWillAppear
- AViewController调用viewDidDisappear
-
BViewController调用viewDidAppear
BVC返回到AVC的生命周期
-
Tips:
当系统执行 layoutSubviews 完成后,会触发ViewController的 viewDidLayoutSubviews 方法调用。因为 viewDidLayoutSubviews 是 view 布局更新后会被唯一可靠调用的方法,所以我们应该把所有依赖于布局或者大小的代码放在 viewDidLayoutSubviews 中,而不是放在 viewDidLoad 或者 viewDidAppear 中。这是避免使用过时的布局或者位置变量的唯一方法。
再者, 新手的文章可能有误,请指正。
网友评论