从 viewWillAppear 到 viewIsAppearing

type
status
date
slug
summary
tags
category
icon
password
在 WWDC23 上,Apple 为 UIViewController 的生命周期引入了一个新的状态 viewIsAppearing。这个实例方法可以让我们对视图和布局有更细致的把握,让我们来探索一下这个方法的作用。
 

viewIsAppearing 的作用

viewIsAppearingviewWillAppearing 之后调用,在 view 被插入到视图层次结构之后,渲染之前调用,所以它适合我们在 ViewController 展示给用户之前更新和调整 UI。虽然系统在  viewWillAppear(_:)  之后调用这个方法,但两个回调都发生在同一个  CATransaction  中,这意味着你在任一方法中所做的更改都会同时对用户可见。
notion image
我们已经有了 viewWillAppearingviewDidLoad,为什么还需要 viewIsAppearing 呢?viewIsAppearing 的特点在于:
  • 精确的位置和形状:当 viewIsAppearing 被调用时,视图具有精确的几何形状,包括大小和安全区域边距。
  • 能获取界面的当前特征:此时视图和视图控制器的特征集合(trait collections)更新到最新状态,我们可以根据环境变化(如深色模式或辅助功能设置)来控制界面的效果。
  • 布局完成:父视图已经布局了视图,这时我们可以对需要展示的视图做最后的调整,例如滚动 tableview 到某一个位置。
 

什么时候使用 viewIsAppearing

之后我们除了 viewWillAppearing 又多了一个选择,如何快速判断选择哪个方法呢?
使用 viewWillAppear(_:):
如果有转场动画效果,我们需要在视图动画过渡之前准备一些东西,比如通过 transitionCoordinator 添加动画,可以在这里设置。以及一些不依赖视图特征和几何形状的操作,比如设置和取消通知,提前配置数据等非 UI 相关的任务。
 
使用 viewIsAppearing(_:):
当需要依赖视图的大小位置和特性来更新视图时,比如说调整依赖整个 view 的宽度来调节子视图的大小。以及布局后的调整,例如滚动 ScrollView 到特定位置。
使用方式如下:
 
可以通过下面这个表格更加清晰的了解如何选择:
viewWillAppear(_:)
viewIsAppearing(_:)
控制进场动画(Transition coordinator)
将视图添加到层次结构中
视图控制器和视图特征集合更新
视图几何(大小、安全区域等)是否准确

UIViewController 生命周期

说到这里,顺便提一下 UIViewController 的生命周期,我画了一张图来直观展示。
notion image

总结

viewIsAppearing  在视图生命周期中提供了一个好时机用于进行 UI 调整。了解了它调用的精确时间,你可以使用这个方法来优化用户界面的细节,让代码更加直观,更好的控制展示效果。
 
参考文档:
 
notion image
  • 📕 小红书/即刻:@轻舟
  • ☕ 如果我的内容有帮助到你,可以请我喝杯咖啡,这将鼓励我为你创造更多有价值的内容。
Buy Me A Coffee
  • Giscus

© 轻舟 2017-2024