UIWindow*window 獲取的4種方法 異同點(diǎn)

UIWindow *window = [[UIApplication sharedApplication]windows].lastObject;
UIWindow *window = [[UIApplication sharedApplication].windows lastObject];
UIWindow *window = [[UIApplication sharedApplication] keyWindow];
UIWindow *window = [[UIApplication sharedApplication].delegate window];
UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(100,100,100,100)];
view.backgroundColor= [UIColor redColor];
[window addSubview:view];

UIWindow &&view&&UIViewController&&app開始運(yùn)行到彈出界面的過程
一、設(shè)置主窗口
[self.window makeKeyAndVisible] 讓窗口成為主窗口并顯示出來(單獨(dú)對(duì)view是沒有辦法自己顯示出來的,必須要依托UIWindow)
[self.window make keyWindow[ 讓UIWindow成為主窗口但不顯示出來
二、獲取UIWindow
①獲取視圖view的列表數(shù)組:[UIApplication sharedApplication].windows (UIApplication指當(dāng)前應(yīng)用程序,windows為UIApplication的屬性,獲取視圖列表)
②獲取主視圖:[UIApplication sharedApplication].keyWindow keyWindows是UIApplication的主視圖屬性。同時(shí)只有當(dāng)前視圖是主視圖
③獲取某個(gè)view所在的UIWindow:view.window
三、窗口創(chuàng)建、視圖顯示過程
main函數(shù)-->UIApplication(argc,argv,nil,NSStringFromClass([AppDelegate class])
(第三個(gè)參數(shù)是主要類,是UIApplication的子類,nil指的就是UIApplication即當(dāng)前應(yīng)用程序;第四個(gè)參數(shù)是代理類,遵循UIApplicationDelegate,負(fù)責(zé)控制程序的運(yùn)行。)
通過這兩個(gè)參數(shù)創(chuàng)建application、創(chuàng)建代理,并把代理設(shè)置給application--->調(diào)用delegate對(duì)象(一般就是APPDelegate)的application:didFinishLaunchingWithOption:方法


接下來分兩種情況
①有storyboard時(shí):根據(jù)info.plist里面的name(即main nib file base name項(xiàng)),找到對(duì)應(yīng)的storyboard,接下來創(chuàng)建一個(gè)window--->>c創(chuàng)建其的控制器(就是箭頭指的那個(gè)),并自動(dòng)把這個(gè)控制器設(shè)置為UIWindow的根控制器。
②沒有storyboard時(shí):
調(diào)用方法后,創(chuàng)建UIWindow-->創(chuàng)建UIWindow的rootViewController--->顯示窗口
注意:第二種方法會(huì)更快。方法是刪去info.plist中的main nib file base name項(xiàng),代碼如下(通用代碼):
-(BOOL)application:(UIApplication) didFinishLaunchingOptions:(NSDictionary)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];//mainScreen獲取當(dāng)前屏幕尺寸;bounds指的是全屏;applicationFrame指的是除了狀態(tài)欄的全屏;
if([[UIDevice currentDevice] userInterfaceIdiom]==UIUserInterfaceIdiomPhone)
{
self.viewController=[[viewController alloc]initWithNibName:@"viewController_iPhone" bundle:nil];//創(chuàng)建window
}
else
{
self.viewController=[[viewController alloc[initWithNibName:@"viewController_iPad: bundle:nil];
}
self.window.rootViewController=self.viewController;//設(shè)置根控制器
[self.window makeKeyAndVisible];//設(shè)置主視圖并顯示
return YES;
}
(該方法負(fù)責(zé)controller類的初始化)
在不用判斷是iPhone還是iPad時(shí),這個(gè)方法可以更加簡(jiǎn)便:
-(BOOL)application:(UIApplication)didFinishLaunchingOptions:(NSDictionary
)launchOptions
{
self.window=[[UIWindow alloc] initWithFrame:[[UIWindow mainScreen] bounds];
self.window.backgroundColor=[UIColor whiteColor];
self.window.rootViewController=self.viewController;//設(shè)置根控制器
[self.window.makeKeyAndVisible];//設(shè)置為主窗口并顯示
return YES;
}
總的過程就是 創(chuàng)建application--->創(chuàng)建代理--->UIWindow
在上面兩段代碼中,self.window.rootViewController=self.viewController設(shè)置根控制器其實(shí)就是將view添加到UIWindow
http://www.it165.net/pro/html/201406/15046.html這里有個(gè)圖,來自官方文檔,十分清晰。UIWindow和view通過根控制器viewController連接
將view添加到UIWindow還有另外一個(gè)方法 addSubview --------->[self.window addSubview:self.view];
但是不推薦這種不通過根控制器直接添加view的做法,原因:
①控制器上可能有按鈕等點(diǎn)擊事件。而控制器是局部變量,若控制器不存在了,而view還存在,會(huì)出錯(cuò);
②若要實(shí)現(xiàn)通過屏幕上的按鈕控制屏幕旋轉(zhuǎn),是由根控制器控制旋轉(zhuǎn)的;而第二種方法因?yàn)楦緵]有用根控制器,自然也無法旋轉(zhuǎn)
三、UIApplication
方法sharedApplication:獲取應(yīng)用程序的句柄
屬性delegate獲取UIApplicationDelegate實(shí)現(xiàn)類的實(shí)例(一般是APPDelegate)
屬性windows獲取當(dāng)前程序涉及到的窗口類數(shù)組
屬性keywindow獲取當(dāng)前程序的主窗口
UIApplication的其他應(yīng)用還包括:設(shè)置應(yīng)用圖標(biāo)右上角的紅色數(shù)字;設(shè)置聯(lián)網(wǎng)指示器的可見性;管理狀態(tài)欄(需要先修改info.plist);利用openURL:方法實(shí)現(xiàn)打電話發(fā)短信發(fā)郵件打開網(wǎng)頁和跳轉(zhuǎn)到其他APP
四、UIApplicationDelegate
其實(shí)例化一般就是AppDelegate,負(fù)責(zé)管理app被打斷時(shí),通知代理進(jìn)入后臺(tái)
aplplication:didFinshLaunchingWithOptions:程序加載完畢
applicationDidBecameActive:程序獲取焦點(diǎn)(可交互)
applicationDidEnterBackground:程序進(jìn)入后臺(tái)
applicationDidResignActive:程序失去焦點(diǎn)(不可交互)
applicationWillEnterForeground:程序從后臺(tái)回到前臺(tái)
applicationDidReciveMemoryWarning:內(nèi)存警告,可能要終止程序
applicationWillTerminate:程序即將退出

http://blog.csdn.net/chengyingzhilian/article/details/7872096

一、UIWindow是一種特殊的UIView,通常在一個(gè)程序中只會(huì)有一個(gè)UIWindow,但可以手動(dòng)創(chuàng)建多個(gè)UIWindow,同時(shí)加到程序里面。UIWindow在程序中主要起到三個(gè)作用:
1、作為容器,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對(duì)象
3、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
二、通常我們可以采取兩種方法將view添加到UIWindow中:
1、addSubview
直接將view通過addSubview方式添加到window中,程序負(fù)責(zé)維護(hù)view的生命周期以及刷新,但是并不會(huì)為去理會(huì)view對(duì)應(yīng)的ViewController,因此采用這種方法將view添加到window以后,我們還要保持view對(duì)應(yīng)的ViewController的有效性,不能過早釋放。
2、rootViewController
rootViewController時(shí)UIWindow的一個(gè)遍歷方法,通過設(shè)置該屬性為要添加view對(duì)應(yīng)的ViewController,UIWindow將會(huì)自動(dòng)將其view添加到當(dāng)前window中,同時(shí)負(fù)責(zé)ViewController和view的生命周期的維護(hù),防止其過早釋放
三、WindowLevel
UIWindow在顯示的時(shí)候會(huì)根據(jù)UIWindowLevel進(jìn)行排序的,即Level高的將排在所有Level比他低的層級(jí)的前面。下面我們來看UIWindowLevel的定義:
constUIWindowLevel UIWindowLevelNormal;
constUIWindowLevel UIWindowLevelAlert;
constUIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個(gè)window層級(jí),其中每一個(gè)層級(jí)又可以分好多子層級(jí)(從UIWindow的頭文件中可以看到成員變量CGFloat_windowSublevel;),不過系統(tǒng)并沒有把則個(gè)屬性開出來。UIWindow的默認(rèn)級(jí)別是UIWindowLevelNormal,我們打印輸出這三個(gè)level的值分別如下:
[objc]view plaincopy
print?
2012-03-2722:46:08.752UIViewSample[395:f803] Normal windowlevel:0.000000
2012-03-2722:46:08.754UIViewSample[395:f803] Normal windowlevel:2000.000000
2012-03-2722:46:08.755UIViewSample[395:f803] Normal windowlevel:1000.000000
這樣印證了他們級(jí)別的高低順序從小到大為Normal < StatusBar < Alert,下面請(qǐng)看小的測(cè)試代碼:
TestWindowLevel


  • (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(@"Normal window level: %f", UIWindowLevelAlert);
    NSLog(@"Normal window level: %f", UIWindowLevelStatusBar);
    returnYES;
    }

運(yùn)行結(jié)果如下圖:


我們可以注意到兩點(diǎn):
1)我們生成的normalWindow雖然是在第一個(gè)默認(rèn)的window之后調(diào)用makeKeyAndVisible,但是仍然沒有顯示出來。這說明當(dāng)Level層級(jí)相同的時(shí)候,只有第一個(gè)設(shè)置為KeyWindow的顯示出來,后面同級(jí)的再設(shè)置KeyWindow也不會(huì)顯示。
2)statusLevelWindow在alertLevelWindow之后調(diào)用makeKeyAndVisible,淡仍然只是顯示在alertLevelWindow的下方。這說明UIWindow在顯示的時(shí)候是不管KeyWindow是誰,都是Level優(yōu)先的,即Level最高的始終顯示在最前面。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • UIView的功能 負(fù)責(zé)渲染區(qū)域的內(nèi)容,并且響應(yīng)該區(qū)域內(nèi)發(fā)生的觸摸事件 UIWindow 在iOS App中,UI...
    小蘑菇2閱讀 828評(píng)論 4 5
  • 每一個(gè)IOS程序都有一個(gè)UIWindow,在我們通過模板簡(jiǎn)歷工程的時(shí)候,xcode會(huì)自動(dòng)幫我們生成一個(gè)window...
    jumping鵬閱讀 1,194評(píng)論 0 0
  • UIWindow是Cocoa框架的重要組件之一,所有的UIView都要通過UIWindow來進(jìn)行展現(xiàn),沒有UIWi...
    文興閱讀 5,088評(píng)論 3 33
  • *7月8日上午 N:Block :跟一個(gè)函數(shù)塊差不多,會(huì)對(duì)里面所有的內(nèi)容的引用計(jì)數(shù)+1,想要解決就用__block...
    炙冰閱讀 2,711評(píng)論 1 14
  • EXC_BAD_ACCESS的本質(zhì)詳解以及僵尸模式調(diào)試原理 - 簡(jiǎn)書 有時(shí)候,你會(huì)遇到由EXC_BAD_ACCES...
    ivin閱讀 1,172評(píng)論 0 1

友情鏈接更多精彩內(nèi)容