UIWindow
UIWindow是最頂層的界面容器,繼承自UIView。作用如下:
- 作為UIView的最頂層容器,包含應用顯示所需要的所有UIView。
- 傳遞觸摸消息和鍵盤事件給UIView。
為UIWindow增加UIView
- 通過
addSubView
方法。 - 通過特有的
rootViewController
屬性。通過設置該屬性為要添加view對應的UIViewController,UIWindow會自動將其View添加到當前window中,同時負責維護ViewController和view的生命周期。
系統對UIWindow的使用
通常在一個程序中只會有一個UIWindow,但是有時候調用系統控件時(如UIAlertView),iOS系統為了保證控件在所有的界面之上,他會臨時創建一個新的UIWindow,通過將其UIWindow的UIWindowLevel設置得更高,讓控件蓋在所有的應用界面之上。
UIWindow的UIWindowLevel
屬性定義了UIWindow的層級。一共有三種取值,默認為0:
typedef CGFloat UIWindowLevel;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert;
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar;
手動創建UIWindow
當我們想將某些界面覆蓋在所有界面的最上層時,我們可以手動創建一個UIWindow.UIWindow一旦被創建,他就自動被添加到整個界面之上了。對于復雜的界面可以繼承UIWindow,在子類中寫相關邏輯,可以用單例模式創建等等,根據不同情況來設置。
如果我們創建的UIWindow需要處理鍵盤事件,那就需要合理的將其設置為KeyWindow。keyWindow是被系統設計用來接收鍵盤和其他非觸摸事件的UIWindow.我們可以通過makeKeyWindow
和resignKeyWindow
方法來將自己創建的UIWindow實例設置成keyWindow.
適合用UIWindow來實現的功能有:密碼輸入界面、應用啟動介紹頁、應用內的通知提醒顯示和應用內的彈框廣告等。
不要濫用UIWindow
如果彈出界面明顯屬于某個ViewController,那么更適合把彈出的界面當做這個ViewController的view的subView實現。
常見的濫用方式是把需要彈出的界面都設置成單例,需要的時候就調用顯示,這種做法會使新創建的UIWindow一直得不到釋放。當出現多個UIWindow需要相互有層級覆蓋關系時,實現起來會比較復雜。