在iOS應用中,我們使用UIWindow和UIView來呈現界面。UIWindow并不包含任何默認的內容,但是當他被當作UIView的容器,用于放置引用中所有的UIView。而每一個UIView通常都是用來表示具體的一部分界面,例如一段文字,一張圖片等,當然,你也可以用UIView來當作其他容器UIView的容器。所以UIWindow更多的時候只作為UIView的頂級容器存在.
———以上摘抄自《iOS開發進階》
本章節較好的介紹了UIWindow的使用,算是唐巧大神的經驗之談。
12.1UIWindow簡介
從繼承關系上來看UIWindow繼承自UIView,所以UIWindow包含所有UIView的功能,除此之外,還增加了一些特有的屬性和方法。
我們一定使用過UIWindow,最常見的用法就是在appdelegate中的didFinishLaunchingWithOptions方法中:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
_window = [[UIWindow alloc]initWithFrame:[UIScreen mainScreen].bounds];
tabbarViewController *tabbar = [[tabbarViewController alloc]init];
_window.rootViewController = tabbar;
[_window makeKeyAndVisible];
return YES;
}
UIWindwo的主要作用:
- 作為UIView的 頂級容器,包含應用顯示所需的所有UIView。
- 傳遞觸摸消息和鍵盤事件給UIView。
12.2 為UIWindow增加UIView
- UIWindwo是UIView的子類,所以你可以使用addsubview方法來為UIWindow添加UIView
- 像我們上面在appdelegate中的didFinishLaunchingWithOptions方法中使用的一樣,我們可以通過設置UIWindow的rootViewController
來添加UIView,系統會自動將controller上的view添加到UIWindow上。
12.3系統對UIWindow的使用
在一個app中存在的UIWindow往往并不止一個,例如當使用UIAlertView(現已過期)時系統就是創建了一個UIWindow,并將UIWindowLevel設置的更高來保證UIWindow顯示在最上層。
[UIApplication sharedApplication].windows; //系統中所有的UIWindow的數組,排列為層次從低到高
[UIApplication sharedApplication].keyWindow; //當前活動的UIWindow
12.3.1WindowLevel
上文提到了UIWindow的層次問題,而這個屬性是通過WindowLevel來描述的。這是一個CGFloat類型,在iOS中系統有三個常量:
UIKIT_EXTERN const UIWindowLevel UIWindowLevelNormal; //0 默認值
UIKIT_EXTERN const UIWindowLevel UIWindowLevelAlert; // 2000
UIKIT_EXTERN const UIWindowLevel UIWindowLevelStatusBar __TVOS_PROHIBITED; // 1000
當然事實上并不止這么幾個值,你可以復制成你想要的值。
12.3.2手動創建UIWindow
書中有大片的示例代碼(為什么給我濫竽充數的感覺),總結一下就是以下幾個點:
1、什么時候使用UIWindow?
由于UIWindow的特性—顯示在頂層,所以一般來說我們將會利用這個特性。比如說:密碼輸入界面(支付寶手勢解鎖)、應用介紹、彈出的banner、彈出的廣告之類的。
2、如何顯示UIWindow?
一般來說我們調用makeKeyAndVisible 這個方法來使UIWindow顯示在應用頂層。
事實上我們只需要將self.hidden=NO;就可以顯示出UIWindow了,兩個方法的區別就是上面那個方法同時設置了keyWindow
3、如何移除UIWindow?
_window.hidden = YES;
_window = nil;
12.3.3不要濫用UIWindow
有的時候我們明顯可以判斷這個View屬于某個controller的時候那么更適合將調用vc的addsubview方法來來實現顯示。
同事當UIWindow過多使用的時候,有時候我們很難管理每個Window的層次關系,從而導致希望顯示到頂層UIWindow未能顯示在頂層。
歡迎加入iOS交流群537774852