iOS 應用的啟動過程始於 main() 函數,經過 UIApplicationMain() 初始化運行循環,最終調用 AppDelegate 的 application:didFinishLaunchingWithOptions: 方法。本文重點解析 UIWindow 的創建、配置與顯示機制。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// 1. 創建主窗口,尺寸通常為螢幕 bounds
self.window = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
self.window.backgroundColor = [UIColor redColor];
// 2. 關鍵步驟:顯示窗口並設置為鍵窗口
[_window makeKeyAndVisible];
// 3. 窗口層級設置(影響顯示優先級)
_window.windowLevel = UIWindowLevelStatusBar; // 高於普通窗口
// 4. 創建第二個窗口演示層級關係
UIWindow *w2 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 0, 90, 90)];
w2.backgroundColor = [UIColor greenColor];
w2.hidden = NO; // 顯示但不設置為鍵窗口
w2.windowLevel = UIWindowLevelAlert; // 最高層級:彈窗級
// 5. 獲取當前鍵窗口驗證
UIWindow *w3 = application.keyWindow;
NSLog(@"self.window:%@", self.window);
NSLog(@"w3:%@", w3);
return YES;
}
hidden = NO)並添加到螢幕上UIView 沒有此方法,必須添加到窗口或其他視圖上才能顯示| 層級常量 | 數值 | 用途 |
|---|---|---|
UIWindowLevelNormal | 0 | 普通應用窗口(默認) |
UIWindowLevelStatusBar | 1000 | 狀態欄、電話條等系統 UI |
UIWindowLevelAlert | 2000 | 彈窗、遠程通知覆蓋層 |
原則:高層級窗口永遠覆蓋低層級窗口,同層級按添加順序疊加。
hidden = NO:窗口可見,但不成為鍵窗口,不接收輸入事件keyWindow,可通過 application.keyWindow 獲取SceneDelegate 管理窗口生命周期rootViewController 而非直接操作窗口背景色UIWindowScene 使用理解 UIWindow 的創建時機、makeKeyAndVisible 的語義、窗口層級優先級,對於處理啟動頁、全局彈窗、錯誤提示覆蓋等場景至關重要。現代 iOS 開發雖逐漸向 Scene 架構遷移,但窗口顯示的核心原理始終未變。