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開(kāi)始運(yùn)行到彈出界面的過(guò)程
一抚垄、設(shè)置主窗口
[self.window makeKeyAndVisible] 讓窗口成為主窗口并顯示出來(lái)(單獨(dú)對(duì)view是沒(méi)有辦法自己顯示出來(lái)的秤掌,必須要依托UIWindow)
[self.window make keyWindow[ 讓UIWindow成為主窗口但不顯示出來(lái)
二、獲取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)建、視圖顯示過(guò)程
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)行。)
通過(guò)這兩個(gè)參數(shù)創(chuàng)建application洪添、創(chuàng)建代理垦页,并把代理設(shè)置給application--->調(diào)用delegate對(duì)象(一般就是APPDelegate)的application:didFinishLaunchingWithOption:方法
接下來(lái)分兩種情況
①有storyboard時(shí):根據(jù)info.plist里面的name(即main nib file base name項(xiàng)),找到對(duì)應(yīng)的storyboard干奢,接下來(lái)創(chuàng)建一個(gè)window--->>c創(chuàng)建其的控制器(就是箭頭指的那個(gè))痊焊,并自動(dòng)把這個(gè)控制器設(shè)置為UIWindow的根控制器。
②沒(méi)有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赘艳;
}
總的過(guò)程就是 創(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è)圖克握,來(lái)自官方文檔,十分清晰枷踏。UIWindow和view通過(guò)根控制器viewController連接
將view添加到UIWindow還有另外一個(gè)方法 addSubview --------->[self.window addSubview:self.view];
但是不推薦這種不通過(guò)根控制器直接添加view的做法菩暗,原因:
①控制器上可能有按鈕等點(diǎn)擊事件。而控制器是局部變量旭蠕,若控制器不存在了停团,而view還存在,會(huì)出錯(cuò)掏熬;
②若要實(shí)現(xiàn)通過(guò)屏幕上的按鈕控制屏幕旋轉(zhuǎn)佑稠,是由根控制器控制旋轉(zhuǎn)的;而第二種方法因?yàn)楦緵](méi)有用根控制器旗芬,自然也無(wú)法旋轉(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)指示器的可見(jiàn)性疮丛;管理狀態(tài)欄(需要先修改info.plist)幔嫂;利用openURL:方法實(shí)現(xiàn)打電話發(fā)短信發(fā)郵件打開(kāi)網(wǎng)頁(yè)和跳轉(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通過(guò)addSubview方式添加到window中,程序負(fù)責(zé)維護(hù)view的生命周期以及刷新季眷,但是并不會(huì)為去理會(huì)view對(duì)應(yīng)的ViewController余蟹,因此采用這種方法將view添加到window以后,我們還要保持view對(duì)應(yīng)的ViewController的有效性子刮,不能過(guò)早釋放威酒。
2、rootViewController
rootViewController時(shí)UIWindow的一個(gè)遍歷方法挺峡,通過(guò)設(shè)置該屬性為要添加view對(duì)應(yīng)的ViewController葵孤,UIWindow將會(huì)自動(dòng)將其view添加到當(dāng)前window中,同時(shí)負(fù)責(zé)ViewController和view的生命周期的維護(hù)橱赠,防止其過(guò)早釋放
三尤仍、WindowLevel
UIWindow在顯示的時(shí)候會(huì)根據(jù)UIWindowLevel進(jìn)行排序的,即Level高的將排在所有Level比他低的層級(jí)的前面狭姨。下面我們來(lái)看UIWindowLevel的定義:
constUIWindowLevel UIWindowLevelNormal;
constUIWindowLevel UIWindowLevelAlert;
constUIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個(gè)window層級(jí)宰啦,其中每一個(gè)層級(jí)又可以分好多子層級(jí)(從UIWindow的頭文件中可以看到成員變量CGFloat_windowSublevel;),不過(guò)系統(tǒng)并沒(méi)有把則個(gè)屬性開(kāi)出來(lái)饼拍。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师抄,但是仍然沒(méi)有顯示出來(lái)漓柑。這說(shuō)明當(dāng)Level層級(jí)相同的時(shí)候,只有第一個(gè)設(shè)置為KeyWindow的顯示出來(lái)司澎,后面同級(jí)的再設(shè)置KeyWindow也不會(huì)顯示欺缘。
2)statusLevelWindow在alertLevelWindow之后調(diào)用makeKeyAndVisible,淡仍然只是顯示在alertLevelWindow的下方挤安。這說(shuō)明UIWindow在顯示的時(shí)候是不管KeyWindow是誰(shuí)谚殊,都是Level優(yōu)先的,即Level最高的始終顯示在最前面蛤铜。