亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

深入了解iOS開發中UIWindow的相關使用

2020-07-26 03:33:32
字體:
來源:轉載
供稿:網友

UIWindow是一種特殊的UIView,通常在一個app中只會有一個UIWindow。

iOS程序啟動完畢后,創建的第一個視圖控件就是UIWindow,接著創建控制器的view,最后將控制器的view添加到UIWindow上,于是控制器的view就顯示在屏幕上了。

一個iOS程序之所以能顯示到屏幕上,完全是因為它有UIWindow。也就說,沒有UIWindow,就看不見任何UI界面。

如何獲取UIWindow

(1)[UIApplication sharedApplication].windows  在本應用中打開的UIWindow列表,這樣就可以接觸應用中的任何一個UIView對象(平時輸入文字彈出的鍵盤,就處在一個新的UIWindow中);

(2)[UIApplication sharedApplication].keyWindow(獲取應用程序的主窗口)用來接收鍵盤以及非觸摸類的消息事件的UIWindow,而且程序中每個時刻只能有一個UIWindow是keyWindow;

注:經過代碼驗證,非keyWindow 也是可以接受鍵盤消息的;

提示:如果某個UIWindow內部的文本框不能輸入文字,可能是因為這個UIWindow不是keyWindow;

(3)view.window獲得某個UIView所在的UIWindow。

 

UIWindowLevel

我們知道UIWindow 有三個層級,分別是Normal ,StatusBar,Alert.輸出他們三個層級的值,我們發現從左到右依次是0,1000,2000,也就是說Normal級別是最低的,StatusBar處于中級,Alert級別最高。而通常我們的程序的界面都是處于Normal這個級別的,系統頂部的狀態欄應該是處于StatusBar級別,UIActionSheet和UIAlertView這些通常都是用來中斷正常流程,提醒用戶等操作,因此位于Alert級別。

根據window顯示級別優先原則,級別高的會顯示在最上層,級別低的在下面,我們程序正常顯示的view在最底層;

keyWindow

官方文檔中是這樣解釋的 “The key window is the one that is designated to receive keyboard and other non-touch related events. Only one window at a time may be the key window." 翻譯過來就是說,keyWindow是指定的用來接收鍵盤以及非觸摸類的消息,而且程序中每一個時刻只能有一個window是keyWindow。

 

觀察UIWindow的文檔,我們可以發現里面有四個關于window變化的通知:

  UIWindowDidBecomeVisibleNotification

  UIWindowDidBecomeHiddenNotification

  UIWindowDidBecomeKeyNotification

  UIWindowDidResignKeyNotification

  這四個通知對象中的object都代表當前已顯示(隱藏),已變成keyWindow(非keyWindow)的window對象,其中的userInfo則是空的。于是我們可以注冊這個四個消息,再打印信息來觀察keyWindow的變化以及window的顯示,隱藏的變動

變成keywindow 的流程是這樣的

1.程序默認的window先顯示出來

2.默認的window再變成keywindow

3.AlertView 的window顯示出來

4.默認的window變成keywindow

5.最終AlertView的window變成keywindow

 

iOS8開始UIWindow的bounds發生變化(Window本身發生了旋轉)
 
  iOS 7之前Window的bounds不會隨著方向而變化,但是到了iOS 8以后,隨著設備方向的旋轉,window.bounds.size.width和window.bounds.size.height也會相應發生變化。
 
  做個很簡單的測試,代碼如下:
 

復制代碼 代碼如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
   
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(orientationChanged:)
                                                 name:UIDeviceOrientationDidChangeNotification
                                               object:nil];
   
    return YES;
}

- (void)orientationChanged:(NSNotification*)noti {
   
    UIDeviceOrientation orientation = [UIDevice currentDevice].orientation;
    NSString *orientationDes = nil;
    switch (orientation) {
        case UIDeviceOrientationLandscapeLeft:
            orientationDes = @"UIInterfaceOrientationLandscapeRight";
            break;
        case UIDeviceOrientationLandscapeRight:
            orientationDes = @"UIInterfaceOrientationLandscapeLeft";
            break;
        case UIDeviceOrientationPortrait:
            orientationDes = @"UIInterfaceOrientationPortrait";
            break;
        case UIDeviceOrientationPortraitUpsideDown:
            orientationDes = @"UIInterfaceOrientationPortraitUpsideDown";
            break;
        default:
            orientationDes = @"";
            break;
    }
   
    NSLog(@"system ver: %@, /rorientaion: %@, /rwindow bounds: %@",
          [UIDevice currentDevice].systemVersion,
          orientationDes,
          NSStringFromCGRect(self.window.bounds));
}


  示例代碼很簡單,新建一個工程,然后在delegate中直接添加以上代碼即可。
 
  iOS 8上運行結果為:

復制代碼 代碼如下:

2014-06-04 09:26:32.016 SviOS8[4143:61114] system ver: 8.0,

orientaion: UIInterfaceOrientationLandscapeRight,

window bounds: {{0, 0}, {320, 480}}

2014-06-04 09:26:34.788 SviOS8[4143:61114] system ver: 8.0,

orientaion: UIInterfaceOrientationPortrait,

window bounds: {{0, 0}, {480, 320}}

2014-06-04 09:26:35.791 SviOS8[4143:61114] system ver: 8.0,

orientaion: UIInterfaceOrientationLandscapeLeft,

window bounds: {{0, 0}, {320, 480}}

2014-06-04 09:26:47.468 SviOS8[4143:61114] system ver: 8.0,

orientaion: UIInterfaceOrientationPortraitUpsideDown,

window bounds: {{0, 0}, {480, 320}}


  iOS 7及之前的版本運行結果為:
 

復制代碼 代碼如下:
2014-06-04 09:39:00.527 SviOS8[4380:70b] system ver: 7.0.3,

orientaion: UIInterfaceOrientationLandscapeRight,

window bounds: {{0, 0}, {320, 480}}

2014-06-04 09:39:00.895 SviOS8[4380:70b] system ver: 7.0.3,

orientaion: UIInterfaceOrientationPortrait,

window bounds: {{0, 0}, {320, 480}}

2014-06-04 09:39:01.225 SviOS8[4380:70b] system ver: 7.0.3,

orientaion: UIInterfaceOrientationLandscapeLeft,

window bounds: {{0, 0}, {320, 480}}

2014-06-04 09:39:11.004 SviOS8[4380:70b] system ver: 7.0.3,

orientaion: UIInterfaceOrientationPortraitUpsideDown,

window bounds: {{0, 0}, {320, 480}}


  通過對比我們可以清晰的看到iOS 8中UIWindow在處理旋轉時策略的變更,雖然會因為與之前的版本不同導致現有項目布局存在的bug,但是可以看到iOS 8中的處理方式更加符合我們的預期,在豎向的時候我們就獲取到width < height, 在橫向則是 width > height,這個符合所見即所得的原則。
 
  題外話,不管是iOS 7還是之前的版本,以及最新出的iOS 8,所有的ViewController的bounds都是正確的,所以只需要堅持一個原則“所有布局都是基于VC.view.bounds布局,那么你的App的顯示就一切正常。”

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av三级在线观看| 成人久久一区二区| 国产精品亚洲一区二区三区| 国产精品极品美女在线观看免费| 97视频在线观看视频免费视频| 91九色单男在线观看| 日韩在线观看视频免费| 97国产suv精品一区二区62| 性欧美暴力猛交69hd| 狠狠久久五月精品中文字幕| 在线日韩精品视频| 国产精品爽黄69| 欧美性猛交视频| 国产精品欧美日韩| 国产一区二区三区18| 国产成人精品免费久久久久| 国产精品海角社区在线观看| 欧美一级成年大片在线观看| 欧美日韩国产精品一区二区不卡中文| 91精品国产99久久久久久| 中文字幕欧美精品日韩中文字幕| www.久久草.com| 欧美日韩国产丝袜另类| 国产精品久久久999| 亚洲美女免费精品视频在线观看| 色播久久人人爽人人爽人人片视av| 色香阁99久久精品久久久| 欧美理论电影网| 国产精品女人久久久久久| 国产精品中文在线| 色综合久久精品亚洲国产| 成人免费xxxxx在线观看| 欧美色视频日本版| 最新国产精品拍自在线播放| 日韩成人在线视频观看| 精品国产自在精品国产浪潮| 亚洲国产欧美日韩精品| 免费91麻豆精品国产自产在线观看| 最近2019中文字幕第三页视频| 国模吧一区二区三区| 精品中文字幕在线| 国产免费久久av| 国产精品欧美一区二区三区奶水| 中文字幕欧美精品日韩中文字幕| 久久香蕉国产线看观看网| 精品一区二区三区电影| 欧美亚洲一级片| 福利精品视频在线| 欧美日韩亚洲天堂| 国产精品午夜视频| 亚洲综合社区网| 78色国产精品| 亚洲综合社区网| 成人国产亚洲精品a区天堂华泰| 亚洲色图15p| 亚洲图片制服诱惑| 日韩精品久久久久久福利| 欧美性xxxx极品hd欧美风情| 亚洲欧洲一区二区三区久久| 91精品视频专区| 国产精品2018| 国产偷亚洲偷欧美偷精品| 亚洲国产精品女人久久久| 日韩视频亚洲视频| 在线视频欧美日韩精品| 高清欧美一区二区三区| 久久久久久久久久久成人| 亚洲精品一区中文字幕乱码| 亚洲第一黄色网| 国产视频在线一区二区| 欧美有码在线视频| www国产91| 色狠狠久久aa北条麻妃| 日韩精品福利网站| 国产婷婷成人久久av免费高清| 国产mv免费观看入口亚洲| 国产精品福利小视频| 久久大大胆人体| 亚洲欧美综合图区| 91中文字幕在线观看| 欧美裸体xxxxx| 国产精品福利在线观看网址| 欧美劲爆第一页| 狠狠躁天天躁日日躁欧美| 亚洲人午夜精品免费| 永久免费看mv网站入口亚洲| 中日韩美女免费视频网址在线观看| 亚洲精品mp4| 日韩成人激情视频| 日韩中文有码在线视频| 91久久久在线| 亚洲精品国产精品久久清纯直播| 亚洲成av人片在线观看香蕉| 色中色综合影院手机版在线观看| 久久99亚洲热视| 久久成人人人人精品欧| 色综久久综合桃花网| 成人午夜在线观看| 欧美日韩成人在线播放| 亚洲午夜未满十八勿入免费观看全集| 4388成人网| 欧美黑人xxx| 国产在线视频2019最新视频| 日韩中文字幕在线视频| 亚洲色图校园春色| 中文字幕日韩在线视频| 国产精品爱久久久久久久| 亚洲电影av在线| 欧美精品免费在线| 九九热最新视频//这里只有精品| 亚洲精品理论电影| 中文字幕久久精品| 亚洲男人天天操| 久久久国产精品亚洲一区| 98午夜经典影视| 日韩网站免费观看高清| 91亚洲国产成人久久精品网站| 在线播放日韩精品| 国产成人精品国内自产拍免费看| 亚洲精品国产欧美| 亚洲自拍欧美另类| 欧美成人精品影院| 欧美一级视频免费在线观看| 国产精品久久综合av爱欲tv| 欧洲成人午夜免费大片| 欧美成人一区二区三区电影| 88xx成人精品| 91成人天堂久久成人| 日韩黄色av网站| 国产在线日韩在线| 欧美精品videossex88| 欧美性受xxxx黑人猛交| 日韩在线视频观看正片免费网站| 成人福利在线视频| 国产在线视频欧美| 欧美自拍视频在线观看| 在线视频国产日韩| 欧美激情第1页| 国产精品美女免费视频| 隔壁老王国产在线精品| 国产成人在线一区二区| 精品露脸国产偷人在视频| 国产日韩在线播放| 成人国产精品一区二区| 日本精品性网站在线观看| 精品亚洲一区二区三区四区五区| 日韩电影在线观看中文字幕| 日韩国产在线看| 91黑丝高跟在线| 亚洲国产精品va在线观看黑人| 久久久久久久电影一区| 国产成人精品网站| 国产一区二中文字幕在线看| 亚洲有声小说3d| 久久免费视频在线观看| 久久99久久99精品免观看粉嫩| 爽爽爽爽爽爽爽成人免费观看| 久久久精品免费视频| 国产综合福利在线| 国产精品久久97| 亚洲精品xxx| 亚洲国产成人在线视频| 国内外成人免费激情在线视频| 亚洲综合第一页|