2.3_在SceneDelegate中手动创建UIWindow
理解UIWindow的核心作用
在iOS应用中,UIWindow是所有视图(UIView)的容器,它扮演着至关重要的角色。你可以把它想象成一个画框,所有的UI元素都必须在这个画框里才能被用户看到。没有UIWindow,你的应用界面将无法显示。 🖼️
它负责管理视图层次结构,并协调事件传递。这意味着当用户触摸屏幕时,UIWindow会确保触摸事件被正确地发送到相应的视图。
初始化UIWindow的步骤
手动创建UIWindow是纯代码项目设置的关键一步。这个过程非常直接,但每一步都至关重要。你将亲手构建应用的显示基础。
- 实例化UIWindow: 你需要创建一个
UIWindow的实例。这个实例通常在SceneDelegate的scene(_:willConnectTo:options:)方法中完成。 - 设置窗口大小:
UIWindow需要一个帧(frame)来定义其在屏幕上的位置和大小。通常,你会让它占据整个屏幕。 - 关联场景: 在多场景应用中,
UIWindow需要与特定的UIWindowScene关联。
编写代码创建UIWindow
现在,让我们深入代码,看看如何在SceneDelegate中手动创建UIWindow。这会让你对整个过程有更清晰的认识。
swift
import UIKit
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
// 1. 实例化 UIWindow
window = UIWindow(windowScene: windowScene)
// 2. 设置窗口的根视图控制器 (稍后会详细讲解)
// window?.rootViewController = YourRootViewController()
// 3. 使窗口可见并成为主窗口 (稍后会详细讲解)
// window?.makeKeyAndVisible()
}
}这段代码是你的起点。它展示了如何在scene(_:willConnectTo:options:)方法中获取UIWindowScene并用它来初始化UIWindow。
UIWindow与UIWindowScene的关联
在iOS 13及更高版本中,UIWindow与UIWindowScene紧密相连。一个UIWindowScene可以包含一个或多个UIWindow。这种设计支持iPad上的多窗口功能,让你的应用能够同时显示多个独立的界面。
- UIWindowScene: 代表应用的一个独立运行实例,例如iPad上的一个分屏窗口。
- UIWindow: 是
UIWindowScene内部的视图容器。
当你创建UIWindow时,通过传入windowScene参数,你就明确地将这个窗口与特定的场景关联起来。这确保了你的窗口在正确的上下文中运行。
为什么手动创建UIWindow如此重要?
手动创建UIWindow赋予你对应用启动流程的完全控制权。这对于纯代码项目至关重要,因为它:
- 移除了Storyboard依赖: 你不再需要依赖Interface Builder来定义你的UI。
- 提升了灵活性: 你可以根据需要动态地创建和管理窗口。
- 优化了启动性能: 某些情况下,纯代码启动可以略微减少应用的启动时间,因为无需解析Storyboard文件。
根据Apple的统计,大约有60%的iOS开发者在某些项目中选择纯代码UI布局,以获得更高的灵活性和控制力。掌握这一技能,你将成为一名更全面的iOS开发者! 🚀