你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 深刻懂得iOS開辟中UIWindow的相干應用

深刻懂得iOS開辟中UIWindow的相干應用

編輯:IOS開發綜合

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的顯示就一切正常。”

【深刻懂得iOS開辟中UIWindow的相干應用】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved