你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> 詳解iOS設計中的UIWindow應用

詳解iOS設計中的UIWindow應用

編輯:IOS開發綜合

每個IOS法式都有一個UIWindow,在我們經由過程模板簡歷工程的時刻,xcode會主動幫我們生成一個Window,然後讓它釀成keyWindow並顯示出來。這一切都來的那末天然,以致於我們年夜部門時刻都疏忽了本身也是可以創立UIWindow對象。
 
  平日在我們須要自界說UIAlertView的時刻(IOS 5.0之前AlertView的配景款式等都不克不及換)我們可使用UIWindow來完成(設置windowLevel為Alert級別),網上有許多例子,這裡就不具體說了。
1、UIWindowLevel
 
  我們都曉得UIWindow有三個層級,分離是Normal,StatusBar,Alert。打印輸入他們三個這三個層級的值我們發明從左到右順次是0,1000,2000,也就是說Normal級別是最低的,StatusBar處於中等程度,Alert級別最高。而平日我們的法式的界面都是處於Normal這個級別上的,體系頂部的狀況欄應當是處於StatusBar級別,UIActionSheet和UIAlertView這些平日都是用來中止正常流程,提示用戶等操作,是以位於Alert級別。
 
  上一篇文章中我也提到了一個料想,既然三個級其余值之間相差1000,並且我們仔細的話檢查UIWindow的頭文件就會發明有一個實例變量_windowSublevel,那我們便可以界說許多中央級其余Window。例如可以自界說比體系UIAlertView級別低一點兒的window。因而寫了一個小demo,經由過程打印發明體系的UIAlertView的級別是1996,而與此同時UIActionSheet的級別是2001,如許也驗證了subLevel切實其實存在。


   UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Alert View"
message:@"Hello Wolrd, i'm AlertView!!!"
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:@"Cancel", nil];
[alertView show];
[alertView release];

UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"ActionSheet"
delegate:nil
cancelButtonTitle:@"Cancel"
destructiveButtonTitle:@"Don't do that!"
otherButtonTitles:@"Hello Wolrd", nil];
[actionSheet showInView:self.view];
[actionSheet release];
  上面是法式運轉截圖:

依據window顯示級別優先的准繩,級別高的會顯示在下面,級別低的鄙人面,我們法式正常顯示的view位於最底層,至於詳細如何獲得UIAlertView和UIActionSheet的level,我會鄙人面第二部門keyWindow中引見並給出響應的代碼。

UIWindow在顯示的時刻會依據UIWindowLevel停止排序的,即Level高的將排在一切Level比他低的層級的後面。上面我們來看UIWindowLevel的界說:


const UIWindowLevel UIWindowLevelNormal;    

const UIWindowLevel UIWindowLevelAlert;    

const UIWindowLevel UIWindowLevelStatusBar;    

typedef CGFloat UIWindowLevel;
  IOS體系中界說了三個window層級,個中每個層級又可以分很多多少子層級(從UIWindow的頭文件中可以看到成員變量CGFloat _windowSublevel;),不外體系並沒有把則個屬性開出來。UIWindow的默許級別是UIWindowLevelNormal,我們打印輸入這三個level的值分離以下:
 

2012-03-27 22:46:08.752 UIViewSample[395:f803] Normal window level: 0.000000

2012-03-27 22:46:08.754 UIViewSample[395:f803] Alert window level: 2000.000000

2012-03-27 22:46:08.755 UIViewSample[395:f803] Status window level: 1000.000000 

 


  如許印證了他們級其余高下次序從小到年夜為Normal < StatusBar < Alert,上面請看小的測試代碼:
 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor yellowColor];
[self.window makeKeyAndVisible];

UIWindow *normalWindow = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
normalWindow.backgroundColor = [UIColor blueColor];
normalWindow.windowLevel = UIWindowLevelNormal;
[normalWindow makeKeyAndVisible];

CGRect windowRect = CGRectMake(50,
50,
[[UIScreen mainScreen] bounds].size.width - 100,
[[UIScreen mainScreen] bounds].size.height - 100);
UIWindow *alertLevelWindow = [[UIWindow alloc] initWithFrame:windowRect];
alertLevelWindow.windowLevel = UIWindowLevelAlert;
alertLevelWindow.backgroundColor = [UIColor redColor];
[alertLevelWindow makeKeyAndVisible];

UIWindow *statusLevelWindow = [[UIWindow alloc] initWithFrame:CGRectMake(0, 50, 320, 20)];
statusLevelWindow.windowLevel = UIWindowLevelStatusBar;
statusLevelWindow.backgroundColor = [UIColor blackColor];
[statusLevelWindow makeKeyAndVisible];

NSLog(@"Normal window level: %f", UIWindowLevelNormal);
NSLog(@"Alert window level: %f", UIWindowLevelAlert);
NSLog(@"Status window level: %f", UIWindowLevelStatusBar);

return YES;

 
  運轉成果以下圖:

我們可以留意到兩點:
 
  1)我們生成的normalWindow固然是在第一個默許的window以後挪用makeKeyAndVisible,然則依然沒有顯示出來。這解釋當Level層級雷同的時刻,只要第一個設置為KeyWindow的顯示出來,前面同級的再設置KeyWindow也不會顯示。
 
  2)statusLevelWindow在alertLevelWindow以後挪用makeKeyAndVisible,依然只是顯示在alertLevelWindow的下方。這解釋UIWindow在顯示的時刻是不論KeyWindow是誰,都是Level優先的,即Level最高的一直顯示在最後面。

2、KeyWindow
 
  甚麼是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。
 
  上面我們寫個簡略的例子看看非keyWindow能不克不及接收鍵盤新聞和觸摸新聞,法式中我們在view中添加一個UITextField,然後新建一個alert級其余window,然後經由過程makeKeyAndVisible讓它釀成keyWindow並顯示出來。代碼以下:
 


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
    // Override point for customization after application launch.
    self.viewController = [[[SvUIWindowViewController alloc] initWithNibName:@"SvUIWindowViewController" bundle:nil] autorelease];
    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
   
    UIWindow *window1 = [[UIWindow alloc] initWithFrame:CGRectMake(0, 80, 320, 320)];
    window1.backgroundColor = [UIColor redColor];
    window1.windowLevel = UIWindowLevelAlert;
    [window1 makeKeyAndVisible];

    return YES;
}

 


- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
   
    [self registerObserver];
   
    // add a textfield
    UITextField *filed = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 320, 60)];
    filed.placeholder = @"Input something here";
    filed.clearsOnBeginEditing = YES;
    filed.borderStyle = UITextBorderStyleRoundedRect;
    [self.view addSubview:filed];
    [filed release];
}


  運轉截圖以下:

從圖中可以看出,固然我們本身新建了一個然後設置為keyWindow並顯示,然則點擊法式中默許window上添加的textField照樣可以喚出鍵盤,並且還可以正常接收鍵盤輸出,只是鍵盤被蓋住了,解釋非keyWindow也是可以接收鍵盤新聞,這一點和文檔上說的不太一樣。
 
  不雅察UIWindow的文檔,我們可以發明外面有四個關於window變更的告訴:
 
  

UIWindowDidBecomeVisibleNotification
 
  UIWindowDidBecomeHiddenNotification
 
  UIWindowDidBecomeKeyNotification
 
  UIWindowDidResignKeyNotification

 
  這四個告訴對象中的object都代表以後已顯示(隱蔽),已釀成keyWindow(非keyWindow)的window對象,個中的userInfo則是空的。因而我們可以注冊這個四個新聞,再打印信息來不雅察keyWindow的變更和window的顯示,隱蔽的更改。
 
  代碼以下:

依據打印的信息我們可以看出流程以下:
 
  1、法式默許的window先顯示出來
 
  2、默許的window再釀成keyWindow
 
  3、AlertView的window顯示出來
 
  4、默許的window釀成非keyWindow
 
  5、終究AlertView的window釀成keyWindow
 
  整體來講就是“要想當老邁(keyWindow),先從小弟(非keyWindow)開端混起” 並且依據打印的信息我們同事可以曉得默許的window的level是0,即normal級別;AlertView的window的level是1996,比Alert級別略微低了一點兒。
 
  b、當我們翻開viewDidAppear中“[self presentActionSheet];”的時刻,掌握台輸入以下:  

keyWindow的變更和window的顯示和下面的流程一樣,同時我們可以看出ActionSheet的window的level是2001。
 
  c、接著上一步,我們點擊彈出ActionSheet的cancel的時刻,掌握台輸入以下:


我們看出流程以下:
 
  1、起首ActionSheet的window釀成非keyWindow
 
  2、法式默許的window釀成keyWindow
 
  3、ActionSheet的window在隱蔽失落
 
  整體就是“想隱居幕後可以,但得先交出權力”。


 

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

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