iOS UIWindow及其應用

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實現

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • UIWindow 簡介 一個UIWindow對象為應用程序的用戶界面提供了背景以及重要的事件處理行為。UIWind...
    ripperhe閱讀 23,675評論 24 58
  • *7月8日上午 N:Block :跟一個函數塊差不多,會對里面所有的內容的引用計數+1,想要解決就用__block...
    炙冰閱讀 2,547評論 1 14
  • UIView的功能 負責渲染區域的內容,并且響應該區域內發生的觸摸事件 UIWindow 在iOS App中,UI...
    小蘑菇2閱讀 796評論 4 5
  • 7、不使用IB是,下面這樣做有什么問題? 6、請說說Layer和View的關系,以及你是如何使用它們的。 1.首先...
    AlanGe閱讀 719評論 0 1
  • 一、問題背景 最近需求量放緩,想起了以前曾經later的小需求,也就是彈出來的AlertView中間的文本框輸入一...
    唐笛_Dylan閱讀 18,520評論 6 29