UIKit 视图生命周期 - viewIsAppearing

在 WWDC23 中,苹果 为 UIViewController 生命周期引入了viewIsAppearing进行微妙的补充。

以前我们常见的生命周期方法包括viewDidLoad()、viewWillAppear(_:)、viewDidAppear(_:)、viewWillDisappear(_:)、viewDidDisappear(_:)。

现在的生命周期路线:

viewIsAppearing 的作用

viewIsAppearing在视图插入视图层次结构之后、布局之前调用,这使其成为最后一刻 UI 更新的理想位置。在处理依赖于精确视图几何形状的动态内容时,其重要性最为明显。不要忘记,viewIsAppearing方法在viewWillAppear 之后但在viewDidAppear之前调用。

为什么 viewIsAppearing 很重要?

准确的几何形状: 在调用时viewIsAppearing,视图具有准确的几何形状,包括大小和安全区域插图。

更新的特征: 视图和视图控制器的特征集合被更新,这对于根据环境变化(如深色模式或辅助功能设置)调整 UI 至关重要。

布局已建立: 超级视图已对视图进行布局,使其成为进行最终调整或将表视图滚动到特定位置的正确位置。

实现viewIsAppearing

super.viewIsAppearing(_:)重写此方法时,调用以维护生命周期事件的完整性至关重要。下面是一个说明 viewIsAppearing 用法的示例:

swift 复制代码
override func viewIsAppearing(_ animated: Bool) {
    super.viewIsAppearing(animated)
    // Assuming a UICollectionView that must scroll to a newly inserted item
    if let newItemIndexPath = newItemIndexPath {
        collectionView.scrollToItem(at: newItemIndexPath, at: .centeredVertically, animated: animated)
    }
}

在这种情况下,viewIsAppearing 方法确保只有在准确确定所有布局信息后,集合视图才会滚动到新项目。

使用 viewIsAppearing 与 viewWillAppear 的使用区别?

使用 viewWillAppear(_:) 用于:

过渡前设置:如果您需要在视图过渡开始之前准备一些东西,

  • 例如通过过渡协调器添加动画。

平衡回调:用于不依赖于视图的特征或几何形状的操作

  • 例如设置或拆除通知、观察者或其他非 UI 相关任务。

使用 viewIsAppearing(_:) 用于:

特征和几何相关的更新:

  • 例如,当您需要更新的特征和几何时,根据视图的大小或布局调整 UI 元素。

布局后调整:如果您需要在视图由其父视图布局后进行更改:

  • 例如滚动到 UIScrollView 中的特定位置。

主要区别

它是在视图添加到层次结构但尚未显示在屏幕上之后调用的。视图控制器的视图已经布局,因此您可以依赖它的大小和特征。

这使得它成为在视图出现在屏幕上之前更新任何 UI 的好地方。

scss 复制代码
override func viewIsAppearing(_ animated: Bool) {
  super.viewIsAppearing(animated)
  enableConstraintsForWidth(traitCollection.horizontalSizeClass)
}

如果您依赖谓词来更新viewDidLoad 中的 UI ,你会希望将该此部分代码移至viewIsAppearing。

总结

  • viewWillAppear和viewDidAppear方法之间的调用。
  • viewIsAppearing在外观转换期间每次调用一次。它不会被调用得太早、太晚或太频繁。恰到好处。
  • viewIsAppearing从 iOS 13 开始使用。
  • 视图出现时更新UI
    1. 更新视图控制器和视图特征集合。
    2. 视图添加到层次结构中,具有精确的几何形状。
相关推荐
2501_916007472 天前
Windows OpenSSL 生成 iOS 证书,制作 p12 与描述文件,KXBuild 签名实操
windows·vscode·ios·objective-c·个人开发·swift·敏捷流程
00后程序员张2 天前
Windows 开发 iOS App 入门,用 SwiftUI 写第一个 iOS App 装到 iPhone
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
andyweike3 天前
Swift
开发语言·ios·swift
静以修身zzz3 天前
OpenStack对象存储-Swift、OpenStack编排管理-heat、OpenStack网络管理-neutron
linux·运维·服务器·架构·openstack·swift
瓦瓦gogo3 天前
第一次了解 iOS 开发:从 Swift、SwiftUI 到公共组件
ios·swiftui·swift
青峰讲运维4 天前
OpenStack 存储深度解析|Cinder 块存储 + Swift 对象存储原理与完整实操(Yoga)
开发语言·openstack·swift
2501_915106324 天前
Windows 上开发 Unity iOS,使用 KXBuild 进行真机调试、性能采样与打包 ipa
windows·vscode·unity·ios·个人开发·swift·敏捷流程
2501_915918416 天前
Windows 上开发 React Native iOS,真机调试、Fast Refresh 与打包 ipa
windows·vscode·react native·ios·个人开发·swift·敏捷流程
szp20056 天前
中文字幕烧进视频后整片空白:CoreText 低报行高,导出照样成功
ios·swift
2501_915106327 天前
iOS 单元测试怎么跑?用 KXApp 在 VS Code 里跑 XCTest 和 Swift Testing
ide·vscode·ios·单元测试·个人开发·swift·敏捷流程