8. UIScreen和UIWindow UIView ?

摘自: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窗口顯示在屏幕上鹏控。
屏幕快照 2017-05-26 09.45.33.png

一致扯、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

  1. 視圖是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有一個根視圖控制器 — 這個視圖控制器負責配置當窗體顯示時最先顯示的視圖

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藤滥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子社裆,更是在濱河造成了極大的恐慌拙绊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件泳秀,死亡現(xiàn)場離奇詭異标沪,居然都是意外死亡,警方通過查閱死者的電腦和手機嗜傅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門金句,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人吕嘀,你說我怎么就攤上這事违寞≌曷鳎” “怎么了?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵趁曼,是天一觀的道長军浆。 經(jīng)常有香客問我,道長挡闰,這世上最難降的妖魔是什么乒融? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮尿这,結果婚禮上簇抵,老公的妹妹穿的比我還像新娘。我一直安慰自己射众,他們只是感情好碟摆,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著叨橱,像睡著了一般典蜕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上罗洗,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天愉舔,我揣著相機與錄音,去河邊找鬼伙菜。 笑死轩缤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的贩绕。 我是一名探鬼主播火的,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼淑倾!你這毒婦竟也來了馏鹤?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤娇哆,失蹤者是張志新(化名)和其女友劉穎湃累,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體碍讨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡治力,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了勃黍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琴许。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖溉躲,靈堂內(nèi)的尸體忽然破棺而出榜田,到底是詐尸還是另有隱情益兄,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布箭券,位于F島的核電站净捅,受9級特大地震影響,放射性物質發(fā)生泄漏辩块。R本人自食惡果不足惜蛔六,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望废亭。 院中可真熱鬧国章,春花似錦、人聲如沸豆村。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽掌动。三九已至四啰,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粗恢,已是汗流浹背柑晒。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留眷射,地道東北人匙赞。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像妖碉,于是被迫代替她去往敵國和親罚屋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容