1、UIWindow是一種特殊的UIView,一般在一個程序中只會有一個UIWindow,但能夠手動建立多個UIWindow,同時加到程序裏面。UIWindow在程序中主要起到三個做用:app
一、做爲容器,包含app所要顯示的全部視圖測試
二、傳遞觸摸消息到程序中view和其餘對象spa
三、與UIViewController協同工做,方便完成設備方向旋轉的支持code
2、一般咱們能夠採起兩種方法將view添加到UIWindow中:orm
一、addSubview對象
直接將view經過addSubview方式添加到window中,程序負責維護view的生命週期以及刷新,可是並不會爲去理會view對應 的ViewController,所以採用這種方法將view添加到window之後,咱們還要保持view對應的ViewController的有效 性,不能過早釋放。blog
二、rootViewController排序
rootViewController時UIWindow的一個遍歷方法,經過設置該屬性爲要添加view對應的 ViewController,UIWindow將會自動將其view添加到當前window中,同時負責ViewController和view的生命 週期的維護,防止其過早釋放生命週期
3、WindowLevelci
UIWindow在顯示的時候會根據UIWindowLevel進行排序的,即Level高的將排在全部Level比他低的層級的前面。下面咱們來看UIWindowLevel的定義:
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統中定義了三個window層級,其中每個層級又能夠分好多子層級(從UIWindow的頭文件中能夠看到成員變量CGFloat _windowSublevel;),不過系統並無把則個屬性開出來。UIWindow的默認級別是UIWindowLevelNormal,咱們打印輸出這三個level的值分別以下:
2012-03-27 22:46:08.752 UIViewSample[395:f803] Normal window level: 0.000000
2012-03-27 22:46:08.754 UIViewSample[395:f803] Alert window level: 2000.000000
2012-03-27 22:46:08.755 UIViewSample[395:f803] Status window level: 1000.000000
|
這樣印證了他們級別的高低順序從小到大爲Normal < StatusBar < Alert,下面請看小的測試代碼:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; self.window.backgroundColor = [UIColor yellowColor]; [self.window makeKeyAndVisible]; UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; normalWindow.backgroundColor = [UIColor blueColor]; normalWindow.windowLevel = UIWindowLevelNormal; [normalWindow makeKeyAndVisible]; CGRect windowRect = CGRectMake(50, 50, [[UIScreen mainScreen] bounds].size.width - 100, [[UIScreen mainScreen] bounds].size.height - 100); UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect]; alertLevelWindow.windowLevel = UIWindowLevelAlert; alertLevelWindow.backgroundColor = [UIColor redColor]; [alertLevelWindow makeKeyAndVisible]; UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 320, 20)]; statusLevelWindow.windowLevel = UIWindowLevelStatusBar; statusLevelWindow.backgroundColor = [UIColor blackColor]; [statusLevelWindow makeKeyAndVisible]; NSLog(@"Normal window level: %f", UIWindowLevelNormal); NSLog(@"Alert window level: %f", UIWindowLevelAlert); NSLog(@"Status window level: %f", UIWindowLevelStatusBar); return YES; }
運行結果以下圖:
咱們能夠注意到兩點:
1)咱們生成的normalWindow雖然是在第一個默認的window以後調用makeKeyAndVisible,可是仍然沒有顯示出來。這說明當Level層級相同的時候,只有第一個設置爲KeyWindow的顯示出來,後面同級的再設置KeyWindow也不會顯示。
2)statusLevelWindow在alertLevelWindow以後調用makeKeyAndVisible,仍然只是顯示在alertLevelWindow的下方。這說明UIWindow在顯示的時候是無論KeyWindow是誰,都是Level優先的,即Level最高的始終顯示在最前面。