iOS支持多窗口的UIScene
iOS支持多窗口的UIScene

iOS支持多窗口的UIScene

UIScene 是 iOS 13 引入的一个类,是 Apple 用来支持多窗口(Multi-Window)机制的核心概念。

UIScene定义

class UIScene : UIResponder

UIScene 表示 App 的一个运行环境实例(Scene)。

每个 scene 代表一块“独立”的用户界面(可以对应一个 UIWindow 和一个 UIViewController 层级)。

iPad 上支持多窗口时,每一个窗口就是一个 UIScene。

UIScene历史

在 iOS 13 之前,App 永远只有一个 UIWindow,由 AppDelegate 管理。

从 iOS 13 开始,为了支持:

1、iPad 多窗口(一个 App 多个独立实例)

2、拓展场景(如 CarPlay、外接显示器)

苹果引入了 Scene-based 生命周期,把每一个“UI 实例”封装成了 UIScene。

常见子类

1、UIWindowScene:最常见,用于在 iPhone/iPad 上展示窗口内容。

2、CPTemplateApplicationScene:CarPlay 场景(少见)。

3、WKScene(私有):Apple Watch 场景。

4、UIScene 本身:是抽象基类,一般不直接用。

UIScene 和 UIApplication 的关系

UIApplication 代表整个 App 的生命周期(全局维度);

UIScene 是 App 中的某一个“窗口实例”的生命周期(局部 UI 实例);

一个 App 可以有多个 scene,每个 scene 有自己的生命周期、UI 树。

结构图关系

UIScene与UIWindowScene、UIWindow的关联

1、UIScene:在 iPad 的多窗口系统中(从 iOS 13 开始):

每一个用户可以操作的独立窗口(哪怕是同一个 App 的多个窗口):

1)都是一个 UIScene。

2)更具体来说,是一个 UIWindowScene。

2、UIWindowScene:提供环境上下文,包括:

1) 当前窗口的尺寸(尤其在分屏时)。

2)方向、屏幕连接、键盘场景等信息。

3)与 UISceneDelegate 联动处理生命周期。

它并不负责 UI 展示,而是负责:这个窗口所处的环境信息(“scene context”)。

3、UIWindow:将视图(UIView)显示在屏幕上的容器。

一个 UIWindowScene 包含一个或多个 UIWindow,但绝大多数情况下只用一个 UIWindow。

生命周期变化

原来(iOS 12 及以下)

App 只有一个入口 AppDelegate。

所有 UI 通过 window 展示。

App 的生命周期统一由 UIApplicationDelegate 控制。

新的 Scene 架构(iOS 13+)

App 有多个 UIScene 实例。

每个 Scene 管理自己的 UI 生命周期。

引入了 SceneDelegate 处理每个窗口的生命周期。

Scene 生命周期相关代理方法(SceneDelegate)

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
func sceneDidDisconnect(_ scene: UIScene)
func sceneDidBecomeActive(_ scene: UIScene)
func sceneWillResignActive(_ scene: UIScene)
func sceneWillEnterForeground(_ scene: UIScene)
func sceneDidEnterBackground(_ scene: UIScene)

这些类似于以前 AppDelegate 的生命周期方法,但是作用于单个 Scene。

总结

UIScene 是 iOS 多窗口系统中,表示“某一个独立用户界面实例”的对象,它使得 App 能支持多个界面实例(特别是在 iPad 上)。

相关文章

1、iOS App生命周期管理:https://fangjunyu.com/2025/05/20/ios-app%e7%94%9f%e5%91%bd%e5%91%a8%e6%9c%9f%e7%ae%a1%e7%90%86/

2、iOS UIApplication类:https://fangjunyu.com/2025/05/20/ios-uiapplication%e7%b1%bb/

3、iOS窗口容器UIWindow:https://fangjunyu.com/2025/05/20/ios%e7%aa%97%e5%8f%a3%e5%ae%b9%e5%99%a8uiwindow/

   

如果您认为这篇文章给您带来了帮助,您可以在此通过支付宝或者微信打赏网站开发者。

欢迎加入我们的 微信交流群QQ交流群,交流更多精彩内容!
微信交流群二维码 QQ交流群二维码

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注