摘自:http://blog.csdn.net/zhbitxhd/article/details/22291999
UIScreen (屏幕) UIWindow (窗口) UIView (視圖) 是IOS的幾個基本界面元素仰税。
*其中UIWindow (窗口) 和 UIView (視圖) 是為 iPhone 應用程序構造用戶界面的可視組件倦畅。
UIWindow 為內(nèi)容顯示提供背景平臺蹂季,UIView負責絕大部分的內(nèi)容描畫乾闰,并負責響應用戶的交互唉工。
1. UIScreen
UIScreen一般也只是用來獲取屏幕大小
CGrect screenBounds = [[UIScreen mainScreen] bounds];//返回的是帶有狀態(tài)欄的Rect (0.0,0.0,320.0,480.0)
CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];//不包含狀態(tài)欄的Rect(0.0,20.0,320.0,480.0)[iphone狀態(tài)欄高度20像素]
2. UIWindow
2.1 iPhone 應用程序通常只有一個窗口,表示為一個UIWindow類的實例汹忠。應用程序在啟動時(或者從nib文件進行裝載)創(chuàng)建這個窗口,并往窗口中加入一或多個視圖并顯示出來雹熬。之后我們很少需要再次引用它宽菜;
2.2 UIWindow 對象是所有UIView的根,管理和協(xié)調(diào)的應用程序的顯示竿报。一般應用程序只有一個UIWindow對象铅乡,即使有多個UIWindow對象,也只有一個UIWindow可以接受到用戶的觸屏事件烈菌。
2.3 在iOS中阵幸,UIWindow 對象并沒有像 windows 應用程序中常見的關閉框或標題欄這樣的部件,普通用戶不能直接對其進行關閉或其它操作芽世。所有對窗口的操作都需要通過其編程接口來實現(xiàn)挚赊。應用程序可以借助窗口對象來進行事件傳遞。窗口對象會持續(xù)跟蹤當前的第一響應者對象济瓢,并在 UIApplication 對象提出請求時將事件傳遞它荠割。
2.4 在Mac OS X中,NSWindow的父類是 NSResponder旺矾;而在iPhone OS中蔑鹦,UIWindow 的父類是 UIView。因此箕宙,UIWindow 窗口在IOS中也是一個視圖對象嚎朽。
2.5 在創(chuàng)建應用程序窗口時,應該總是將其初始的邊框尺寸設置為整個屏幕的大小柬帕。如果您的窗口是從nib文件裝載得到哟忍,Interface Builder 并不允許創(chuàng)建比屏幕尺寸小的窗口狡门;然而,如果您的窗口是通過編程方式創(chuàng)建的魁索,則必須在創(chuàng)建時傳入期望的邊框矩形融撞。除了屏幕矩形之外,沒有理由傳入其它邊框矩形粗蔚。屏幕矩形可以通過UIScreen 對象來取得尝偎,具體代碼如下所示:
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.rootViewController = viewController;
//UIWindow有一個根視圖控制器—這個視圖控制器負責配置當窗體顯示時最先顯示的視圖。
[self.window makeKeyAndVisible];//這行代碼會讓包含了視圖控制器視圖的Window窗口顯示在屏幕上鹏控。
一致扯、UIWindow 是一種特殊的 UIView碴开,通常在一個程序中只會有一個 UIWindow尚镰,但可以手動創(chuàng)建多個 UIWindow,同時加到程序里面镰绎。
UIWindow 在程序中主要起到三個作用:
1缘揪、作為容器耍群,包含app所要顯示的所有視圖
2、傳遞觸摸消息到程序中view和其他對象
3找筝、與UIViewController 協(xié)同工作蹈垢,方便完成設備方向旋轉的支持
二、通常我們可以采取兩種方法將 view 添加到 UIWindow 中:
1袖裕、addSubview
直接將view通過addSubview 方式添加到 window 中曹抬,程序負責維護view的生命周期以及刷新,但是并不會為去理會 view 對應的ViewController急鳄,因此采用這種方法將 view 添加到 window 以后谤民,我們還要保持 view 對應的 ViewController 的有效性,不能過早釋放疾宏。
2张足、rootViewController
rootViewController是UIWindow的一個遍歷方法,通過設置該屬性為要添加view對應的ViewController灾锯,UIWindow將會自動將其view添加到當前window中兢榨,同時負責ViewController和view的生命周期的維護,防止其過早釋放
三顺饮、WindowLevel
UIWindow在顯示的時候會根據(jù)UIWindowLevel進行排序的吵聪,即Level高的將排在所有Level比他低的層級的前面。下面我們來看UIWindowLevel的定義:
const UIWindowLevel UIWindowLevelNormal;
const UIWindowLevel UIWindowLevelAlert;
const UIWindowLevel UIWindowLevelStatusBar;
typedef CGFloat UIWindowLevel;
IOS系統(tǒng)中定義了三個window層級兼雄,其中每一個層級又可以分好多子層級(從UIWindow的頭文件中可以看到成員變量CGFloat _windowSublevel;)吟逝,不過系統(tǒng)并沒有把則個屬性開出來。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] Normal window level: 2000.0000002012-03-27 22:46:08.755 UIViewSample[395:f803] Normal window level: 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;
}
3. 視圖UIView
- 視圖是UIView類的實例块攒,負責在屏幕上定義一個矩形區(qū)域励稳。視圖在展示用戶界面及響應用戶界面交互方面發(fā)揮關鍵作用。每個視圖對象都要負責渲染視圖矩形區(qū)域中的內(nèi)容囱井,并響應該區(qū)域中發(fā)生的操作事件驹尼。
2.視圖是應用程序與用戶交互的重要機制。除了顯示內(nèi)容和處理事件之外庞呕,視圖還可以用于管理一或多個子視圖新翎。子視圖是指嵌入到另一視圖對象邊框內(nèi)部的視圖對象,而被嵌入的視圖則被稱為父視圖或超視圖住练。視圖的這種布局方式被稱為視圖層次地啰,一個視圖可以包含任意數(shù)量的子視圖,通過為子視圖添加子視圖的方式讲逛,視圖可以實現(xiàn)任意深度的嵌套亏吝。子視圖總是被顯示在其父視圖的上方。每個父視圖都負責管理其直接的子視圖盏混,根據(jù)需要調(diào)整它們的位置和尺寸蔚鸥,以及響應它們沒有處理的事件。
3.在IOS中視圖和視圖控制器緊密協(xié)作许赃,視圖控制器的作用是處理視圖的裝載與卸載株茶、處理由于設備旋轉導致的界面旋轉,以及和用于構建復雜用戶界面的高級導航對象進行交互图焰。
http://blog.csdn.net/xyz_lmn/article/details/9022399
總結:
iPhone應用程序通常只有一個窗口,表示為一個UIWindow類的實例蹦掐。應用程序在啟動時(或者從nib文件進行裝載)創(chuàng)建這個窗口技羔,并往窗口中加入一或多個視圖并顯示出來。UIWindow創(chuàng)建完是會自動加載到屏幕上顯示出來的卧抗,不用像其他UIView一樣addSubview才行
UIWindow有一個根視圖控制器 — 這個視圖控制器負責配置當窗體顯示時最先顯示的視圖