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

首頁 > 系統 > iOS > 正文

詳解iOS設計中的UIWindow使用

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

每一個IOS程序都有一個UIWindow,在我們通過模板簡歷工程的時候,xcode會自動幫我們生成一個window,然后讓它變成keyWindow并顯示出來。這一切都來的那么自然,以至于我們大部分時候都忽略了自己也是可以創建UIWindow對象。
 
  通常在我們需要自定義UIAlertView的時候(IOS 5.0以前AlertView的背景樣式等都不能換)我們可以使用UIWindow來實現(設置windowLevel為Alert級別),網上有很多例子,這里就不詳細說了。
一、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.0000002012-03-27 22:46:08.754 UIViewSample[395:f803] Alert window level: 2000.0000002012-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最高的始終顯示在最前面。

二、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在隱藏掉
 
  總體就是“想隱居幕后可以,但得先交出權利”。


 

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲国产精久久久久久久| 综合激情国产一区| 欧美风情在线观看| 欧美日韩成人精品| 亚洲精品久久视频| 国产综合在线看| 亚洲日韩中文字幕| 欧美激情第三页| 日韩在线观看成人| 中文字幕精品网| 最近中文字幕日韩精品| 亚洲福利视频久久| 热久久美女精品天天吊色| 欧洲美女免费图片一区| 亚洲激情在线观看视频免费| 国产欧美日韩中文字幕| 日韩成人在线免费观看| 亚洲第一福利网站| 91在线高清免费观看| 日韩av电影免费观看高清| 日韩精品中文字幕久久臀| 综合网中文字幕| 九九精品在线视频| 久久综合免费视频影院| 国产成一区二区| 91精品在线观| 国产69精品99久久久久久宅男| 日韩福利伦理影院免费| 久久久久久久999| 久久免费精品日本久久中文字幕| 欧美专区第一页| 亚洲aⅴ日韩av电影在线观看| 亚洲精品福利资源站| 2019中文字幕在线| 日韩欧美国产黄色| 中文字幕亚洲欧美| 久久精品中文字幕电影| 日韩av中文字幕在线免费观看| 欧美国产在线视频| 日本成人黄色片| 麻豆国产va免费精品高清在线| 在线视频国产日韩| 精品视频在线播放色网色视频| 亚洲精品永久免费精品| 久久免费视频在线| 欧美激情在线一区| 成人午夜在线观看| 亚洲欧美国产精品| www.久久久久久.com| 亚洲综合日韩在线| 久久综合九色九九| 91高清视频在线免费观看| 国产网站欧美日韩免费精品在线观看| 国产精品久久久久高潮| 欧美人与性动交a欧美精品| 懂色av影视一区二区三区| 97人洗澡人人免费公开视频碰碰碰| 国模精品视频一区二区| 日韩欧美在线视频| 视频在线一区二区| 亚洲国产天堂久久国产91| 最好看的2019的中文字幕视频| 国产精品96久久久久久又黄又硬| 亚洲综合在线播放| 久久成人一区二区| 国产精品91一区| 亚洲人成网站777色婷婷| 日韩av一区在线观看| 国产精品久久久久国产a级| 久久国内精品一国内精品| 国产精品欧美风情| 米奇精品一区二区三区在线观看| 国产精品久久久久久av下载红粉| 欧美成年人在线观看| 欧美另类在线播放| 中文字幕国产亚洲| 国产一级揄自揄精品视频| 在线看日韩欧美| 1769国内精品视频在线播放| 九九九热精品免费视频观看网站| 精品国产户外野外| 色噜噜国产精品视频一区二区| 欧美成人精品激情在线观看| 精品国产乱码久久久久久虫虫漫画| 亚洲精品在线观看www| 久久久久久久影院| 国产精品久久久久77777| 欧美精品第一页在线播放| 亚洲色图激情小说| 91视频国产精品| 国产精品一区二区三区成人| 欧美裸体xxxxx| 国产不卡一区二区在线播放| 国产精品一区二区久久精品| 国产丝袜一区视频在线观看| 欧美精品videos性欧美| 亚洲精品国产精品国产自| 久久人人爽亚洲精品天堂| 国产精品视频一区国模私拍| 欧美在线观看一区二区三区| 日本不卡高字幕在线2019| 亚洲精品成a人在线观看| 欧美老少做受xxxx高潮| 日韩中文字幕精品视频| 亚洲日本中文字幕免费在线不卡| 亚洲免费人成在线视频观看| 国产精品三级在线| 97国产精品视频人人做人人爱| 亚洲免费视频在线观看| 日韩色av导航| 日韩成人高清在线| 伦理中文字幕亚洲| 91精品视频观看| 日韩av在线电影网| 97在线精品视频| 亚洲一区二区久久久久久久| 国产精品福利网站| 黑人巨大精品欧美一区二区三区| 日韩成人在线视频| 91久久嫩草影院一区二区| 亚洲人成77777在线观看网| 亚洲欧美国产制服动漫| 中日韩美女免费视频网址在线观看| 国产精品美女无圣光视频| 中文字幕久久久av一区| 精品久久久一区| 国产福利精品视频| 亚洲女人天堂色在线7777| 精品欧美aⅴ在线网站| 奇米影视亚洲狠狠色| 大荫蒂欧美视频另类xxxx| 久久视频在线观看免费| 91亚洲精品一区二区| 亚洲老头同性xxxxx| 91日本在线视频| 日本精品免费一区二区三区| 日韩精品一二三四区| 91精品在线观看视频| 亚洲美女免费精品视频在线观看| 成人性生交大片免费看视频直播| 中文字幕精品久久久久| 日韩成人在线视频观看| 青青久久av北条麻妃黑人| 久久免费视频观看| 亚洲精品视频中文字幕| 国产精品视频白浆免费视频| 欧美国产日韩二区| 国产精品国语对白| 国产精品91在线观看| 米奇精品一区二区三区在线观看| 国产一区二区三区直播精品电影| 久久精品久久久久电影| 疯狂欧美牲乱大交777| 91精品美女在线| 久久人人爽亚洲精品天堂| 国产成人精品亚洲精品| 九九视频直播综合网| 国产欧美日韩91| 欧美日韩国产一中文字不卡| 91网站免费观看| 97香蕉久久夜色精品国产| 日韩精品视频在线| 亚洲精品久久久久久久久久久久久| 亚洲a∨日韩av高清在线观看|