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開始運行到彈出界面的過程
一、設(shè)置主窗口
[self.window makeKeyAndVisible] 讓窗口成為主窗口并顯示出來(單獨對view是沒有辦法自己顯示出來的,必須要依托UIWindow)
[self.window make keyWindow[ 讓UIWindow成為主窗口但不顯示出來
二、獲取UIWindow
①獲取視圖view的列表數(shù)組:[UIApplication sharedApplication].windows (UIApplication指當前應(yīng)用程序,windows為UIApplication的屬性,獲取視圖列表)
②獲取主視圖:[UIApplication sharedApplication].keyWindow keyWindows是UIApplication的主視圖屬性。同時只有當前視圖是主視圖
③獲取某個view所在的UIWindow:view.window
三、窗口創(chuàng)建、視圖顯示過程
main函數(shù)-->UIApplication(argc,argv,nil,NSStringFromClass([AppDelegate class])
(第三個參數(shù)是主要類,是UIApplication的子類,nil指的就是UIApplication即當前應(yīng)用程序;第四個參數(shù)是代理類,遵循UIApplicationDelegate,負責(zé)控制程序的運行。)
通過這兩個參數(shù)創(chuàng)建application、創(chuàng)建代理,并把代理設(shè)置給application--->調(diào)用delegate對象(一般就是APPDelegate)的application:didFinishLaunchingWithOption:方法
接下來分兩種情況
①有storyboard時:根據(jù)info.plist里面的name(即main nib file base name項),找到對應(yīng)的storyboard,接下來創(chuàng)建一個window--->>c創(chuàng)建其的控制器(就是箭頭指的那個),并自動把這個控制器設(shè)置為UIWindow的根控制器。
②沒有storyboard時:
調(diào)用方法后,創(chuàng)建UIWindow-->創(chuàng)建UIWindow的rootViewController--->顯示窗口
注意:第二種方法會更快。方法是刪去info.plist中的main nib file base name項,代碼如下(通用代碼):
-(BOOL)application:(UIApplication) didFinishLaunchingOptions:(NSDictionary)launchOptions
{
self.window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen] bounds]];//mainScreen獲取當前屏幕尺寸;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;
}
(該方法負責(zé)controller類的初始化)
在不用判斷是iPhone還是iPad時,這個方法可以更加簡便:
-(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è)置根控制器其實就是將view添加到UIWindow
http://www.it165.net/pro/html/201406/15046.html這里有個圖,來自官方文檔,十分清晰。UIWindow和view通過根控制器viewController連接
將view添加到UIWindow還有另外一個方法 addSubview --------->[self.window addSubview:self.view];
但是不推薦這種不通過根控制器直接添加view的做法,原因:
①控制器上可能有按鈕等點擊事件。而控制器是局部變量,若控制器不存在了,而view還存在,會出錯;
②若要實現(xiàn)通過屏幕上的按鈕控制屏幕旋轉(zhuǎn),是由根控制器控制旋轉(zhuǎn)的;而第二種方法因為根本沒有用根控制器,自然也無法旋轉(zhuǎn)
三、UIApplication
方法sharedApplication:獲取應(yīng)用程序的句柄
屬性delegate獲取UIApplicationDelegate實現(xiàn)類的實例(一般是APPDelegate)
屬性windows獲取當前程序涉及到的窗口類數(shù)組
屬性keywindow獲取當前程序的主窗口
UIApplication的其他應(yīng)用還包括:設(shè)置應(yīng)用圖標右上角的紅色數(shù)字;設(shè)置聯(lián)網(wǎng)指示器的可見性;管理狀態(tài)欄(需要先修改info.plist);利用openURL:方法實現(xiàn)打電話發(fā)短信發(fā)郵件打開網(wǎng)頁和跳轉(zhuǎn)到其他APP
四、UIApplicationDelegate
其實例化一般就是AppDelegate,負責(zé)管理app被打斷時,通知代理進入后臺
aplplication:didFinshLaunchingWithOptions:程序加載完畢
applicationDidBecameActive:程序獲取焦點(可交互)
applicationDidEnterBackground:程序進入后臺
applicationDidResignActive:程序失去焦點(不可交互)
applicationWillEnterForeground:程序從后臺回到前臺
applicationDidReciveMemoryWarning:內(nèi)存警告,可能要終止程序
applicationWillTerminate:程序即將退出
http://blog.csdn.net/chengyingzhilian/article/details/7872096
一、UIWindow是一種特殊的UIView,通常在一個程序中只會有一個UIWindow,但可以手動創(chuàng)建多個UIWindow,同時加到程序里面。UIWindow在程序中主要起到三個作用:
1、作為容器,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對象
3、與UIViewController協(xié)同工作,方便完成設(shè)備方向旋轉(zhuǎn)的支持
二、通常我們可以采取兩種方法將view添加到UIWindow中:
1、addSubview
直接將view通過addSubview方式添加到window中,程序負責(zé)維護view的生命周期以及刷新,但是并不會為去理會view對應(yīng)的ViewController,因此采用這種方法將view添加到window以后,我們還要保持view對應(yīng)的ViewController的有效性,不能過早釋放。
2、rootViewController
rootViewController時UIWindow的一個遍歷方法,通過設(shè)置該屬性為要添加view對應(yīng)的ViewController,UIWindow將會自動將其view添加到當前window中,同時負責(zé)ViewController和view的生命周期的維護,防止其過早釋放
三、WindowLevel
UIWindow在顯示的時候會根據(jù)UIWindowLevel進行排序的,即Level高的將排在所有Level比他低的層級的前面。下面我們來看UIWindowLevel的定義:
constUIWindowLevel UIWindowLevelNormal;
constUIWindowLevel UIWindowLevelAlert;
constUIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個window層級,其中每一個層級又可以分好多子層級(從UIWindow的頭文件中可以看到成員變量CGFloat_windowSublevel;),不過系統(tǒng)并沒有把則個屬性開出來。UIWindow的默認級別是UIWindowLevelNormal,我們打印輸出這三個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
這樣印證了他們級別的高低順序從小到大為Normal < StatusBar < Alert,下面請看小的測試代碼:
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;
}
運行結(jié)果如下圖:
我們可以注意到兩點:
1)我們生成的normalWindow雖然是在第一個默認的window之后調(diào)用makeKeyAndVisible,但是仍然沒有顯示出來。這說明當Level層級相同的時候,只有第一個設(shè)置為KeyWindow的顯示出來,后面同級的再設(shè)置KeyWindow也不會顯示。
2)statusLevelWindow在alertLevelWindow之后調(diào)用makeKeyAndVisible,淡仍然只是顯示在alertLevelWindow的下方。這說明UIWindow在顯示的時候是不管KeyWindow是誰,都是Level優(yōu)先的,即Level最高的始終顯示在最前面。