UIWindow簡介
之前一直沒理解AppDelegate里面的強引用UIWindow是什么東西,后來慢慢了解了UIWindow一些知識。
UIWindow繼承自UIView,是一個特殊的UIView,我們一般不會直接去設置其UI展現形式,但它對展現程序中的views至關重要。每一個view,想要出現在屏幕上都依賴于window,但是程序中的window之間是相互獨立的。應用程序收到事件之后會先轉發給適當的window對象,從而又將事件轉發給view對象。
以上簡介摘自:
作者:ripperhe
鏈接:http://www.lxweimin.com/p/98cd7fc4bfba
1, KeyWindow
KeyWindow是每一個App的主顯示窗口,每個App有且只有一個KeyWindow,但是可以有多個UIWindow對象。
常見的純代碼創建AppDelegate的UIWindow
self.window = [[UIWindow alloc] init];
self.window.frame = [UIScreen mainScreen].bounds;
ViewController *vc =[[ViewController alloc] init];
self.window.rootViewController = vc;
[self.window makeKeyAndVisible];
需要主要的是代碼中的window需要強引用,不然代碼已執行完就直接釋放了。
2,其他的UIWindow
App中可以創建多個UIWindow對象,常見的有:
1,stutasWindow:用于管理狀態欄
2,輸入鍵盤window:(UITextEffectsWindow,UIRemoteKeyboardWindow)用戶管理鍵盤輸入
查看window的方法
[UIApplication sharedApplication].keyWindow;
[UIApplication sharedApplication].windows;
self.view.window;
3,UIWindow的等級屬性
windowLevel顯示等級,等級越高越在上面,分別為:
UIWindowLevelNormal 0.000000
UIWindowLevelAlert 2000.000000
UIWindowLevelStatusBar 1000.000000
所以我們通常可以看到狀態欄的窗口可以一直懸浮在其他界面之上。
4,創建UIWindow
創建UIWindow無需addSubbiew 到view上面,系統會自動添加都屏幕上。
dispatch_async(dispatch_get_main_queue(), ^{
UIWindow *myWindow = [[UIWindow alloc] init];
self.myWindow = myWindow;
myWindow.windowLevel = UIWindowLevelAlert;
myWindow.backgroundColor = [UIColor redColor];
myWindow.frame = CGRectMake(30, 30, 30, 30);
myWindow.hidden = NO;
});
常用異步是因為防止還沒有創建rootViewController的時候報錯,或者采用延時創建亦可,UIWindow的hidden默認為YES,要改為NO方能顯示。
5,常用UIWindow案例
1,點擊狀態欄將UISrollView回滾到頂部
實現的原理是在狀態欄處添加了一個UIWindow, 并且該window的等級屬性高于UIWindowLevelStatusBar ,可取為UIWindowLevelAlert,設置背景顏色為透明。
參考代碼:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.25 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
window_ = [[UIWindow alloc] init];
window_.windowLevel = UIWindowLevelAlert;
window_.frame = [UIApplication sharedApplication].statusBarFrame;
window_.backgroundColor = [UIColor clearColor];
window_.hidden = NO;
[window_ addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(windowClick)]];
});
2,蒙層添加到最上層
有時候,創建UIView灰色的蒙層會被UINaviBar或者UITabBar擋住,這時可將蒙層添加到controller.view.window上,可實現蒙層處于最上層,但是值得注意的是,controller.view.window要在viewDidLayoutSubviews函數之后才會賦值。
3,廣告頁面
從后臺拉起程序的時候,顯示廣告頁面,可以利用UIWindow實現