首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

iOS 應用啟動入口與 UIWindow 顯示原理深度剖析

     編輯:C++ 入門

從 main() 到 UIWindow:iOS 應用啟動與窗口顯示全流程

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;
}

核心知識點總結

1. makeKeyAndVisible 的雙重作用

  • 將窗口設置為 Key Window(接收鍵盤輸入、觸摸事件的主窗口)
  • 將窗口設置為可見(hidden = NO)並添加到螢幕上
  • 注意:UIView 沒有此方法,必須添加到窗口或其他視圖上才能顯示

2. 窗口層級體系

層級常量數值用途
UIWindowLevelNormal0普通應用窗口(默認)
UIWindowLevelStatusBar1000狀態欄、電話條等系統 UI
UIWindowLevelAlert2000彈窗、遠程通知覆蓋層

原則:高層級窗口永遠覆蓋低層級窗口,同層級按添加順序疊加。

3. 隱藏 vs 鍵窗口

  • hidden = NO:窗口可見,但不成為鍵窗口,不接收輸入事件
  • 同一時刻僅有一個 keyWindow,可通過 application.keyWindow 獲取

4. 現代開發最佳實踐

  • iOS 13+ 推薦使用 SceneDelegate 管理窗口生命周期
  • 啟動時通常設置 rootViewController 而非直接操作窗口背景色
  • 多窗口場景(如 iPad 多任務、外接顯示器)需配合 UIWindowScene 使用

總結

理解 UIWindow 的創建時機、makeKeyAndVisible 的語義、窗口層級優先級,對於處理啟動頁、全局彈窗、錯誤提示覆蓋等場景至關重要。現代 iOS 開發雖逐漸向 Scene 架構遷移,但窗口顯示的核心原理始終未變。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved