A.UIWindow概念
1.繼承UIView,是一種特殊的UIView
2.通常一個APP只有一個UIWindow
3.iOS程序啟動后,創(chuàng)建的第一個視圖就是UIWindow
4.沒有UIWindow,不能顯示任何東西
B.使用
沒有了storyboard,要手動實現(xiàn)UIWindow的創(chuàng)建代碼(其實這就是storyboard做的事情)
1 // 手動創(chuàng)建UIWindow,并加到screen上2 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];3 self.window.backgroundColor = [UIColor whiteColor];4 [self.window makeKeyAndVisible];
2.創(chuàng)建一個控制器
3.把控制器的view添加到UIWindow
添加UIView到UIWindow中兩種常見方式:
- (void)addSubview:(UIView *)view;
直接將view添加到UIWindow中,但并不會理會view對應的UIViewController
@
PRoperty(nonatomic,retain) UIViewController *rootViewController;
自動將rootViewController的view添加到UIWindow中,負責管理rootViewController的生命周期
常用方法
- (void)makeKeyWindow;
讓當前UIWindow變成keyWindow(主窗口)
- (void)makeKeyAndVisible;
讓當前UIWindow變成keyWindow,并顯示出來
(1)直接添加控制器的view到UIWindow
1 // 添加控制器2 ViewController *controller = [[ViewController alloc] init];3 [self.window addSubview:controller.view];
不建議此方法,因為
a.可能自定義控制器變量被銷毀之后,其view還在UIWindow中被使用,如果再使用控制器會引起崩潰
b.由于沒有傳自定義控制器給UIWindow,不能處理各種相關事件(例如屏幕旋轉)
(2)設置自定義控制器為UIWindow的rootViewController
設置了根控制器之后,會自動把自定義控制器的view加到UIWindow
1 // 添加控制器2 ViewController *controller = [[ViewController alloc] init];3 // [self.window addSubview:controller.view];4 self.window.rootViewController = controller;
(3)在controller中設置狀態(tài)欄可視
1 - (BOOL)prefersstatusBarHidden {2 return NO;3 }
4.界面切換
其實是不同的控制器替換到UIWindow上面
改變self.window.rootViewController
D.UIWindow的其他概念
1.主窗口
a.獲得主窗口 [UIApplication sharedWindow].keyWindow
b.可以通過makeKeyWindow設置主窗口,makeKeyAndVisible來設置主窗口兼可視
c.一個屏幕只能有一個主窗口,使用最后更新(最后使用makeKeyWindow或者makeKeyAndVisible)的UIWindow為主窗口
d.iOS7之前只有主窗口能夠處理TextField輸入事件,之后全部窗口都能處理
1 // 手動創(chuàng)建UIWindow,并加到screen上2 self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];3 self.window.backgroundColor = [UIColor grayColor];4 [self.window makeKeyAndVisible]; // 此刻window是主窗口5 6 // 手動在.h文件中定義了一個window2,不能使用臨時變量,否則會被回收7 self.window2 = [[UIWindow alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];;8 self.window2.backgroundColor = [UIColor redColor];9 [self.window2 makeKeyAndVisible]; // 這時候window2是主窗口
2.屏幕上的所有窗口
[UIApplication sharedApplication].windows
在本應用中打開的UIWindow列表,這樣就可以接觸應用中的任何一個UIView對象
(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中)
[UIApplication sharedApplication].keyWindow
用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindow是keyWindow。如果某個UIWindow內部的文本框不能輸入文字,可能是因為這個UIWindow不是keyWindow
view.window
獲得某個UIView所在的UIWindow
3.TextField呼出的鍵盤是一個獨立的window