IOS學習記錄 基礎類UIWindow,UIView,UISreen篇

IOS開發之UIScreen和UIWindow,UIView

UIScreen(屏幕),UIWindow(窗口),UIView(視圖)是IOS的幾個基本界面元素。其中UIWindow(窗口)和UIView(視圖)是爲iPhone應用程序構造用戶界面的可視組件。UIWindow爲內容顯示提供背景平臺,UIView負責絕大部分的內容描畫,並負責響應用戶的交互。

1,UIScreen

UIScreen一般也只是用來獲取屏幕大小

CGrect screenBounds = [[UIScreen mainScreen] bounds];//返回的是帶有狀態欄的Rect (0.0,0.0,320.0,480.0)

CGRect viewBounds = [[UIScreen mainScreen] applicationFrame];//不包含狀態欄的Rect(0.0,20.0,320.0,480.0)[iphone狀態欄高度20像素]

2.UIWindow

iPhone應用程序通常只有一個窗口,表示爲一個UIWindow類的實例。應用程序在啓動時(或者從nib文件進行裝載)創建這個窗口,並往窗口中加入一或多個視圖並顯示出來。之後我們很少需要再次引用它。UIWindow對象是所有UIView的根,管理和協調的應用程序的顯示。一般應用程序只有一個UIWindow對象,即使有多個UIWindow對象,也只有一個UIWindow可以接受到用戶的觸屏事件。

在IOS中,UIWindow對象並沒有像windows應用程序中常見的關閉框或標題欄這樣的部件,普通用戶不能直接對其進行關閉或其它操作。所有對窗口的操作都需要通過其編程接口來實現。應用程序可以藉助窗口對象來進行事件傳遞。窗口對象會持續跟蹤當前的第一響應者對象,並在UIApplication對象提出請求時將事件傳遞它。

在Mac OS X中,NSWindow的父類是NSResponder;而在iPhone OS中,UIWindow的父類是UIView。因此,UIWindow窗口在IOS中也是一個視圖對象。

在創建應用程序窗口時,應該總是將其初始的邊框尺寸設置爲整個屏幕的大小。如果您的窗口是從nib文件裝載得到,Interface Builder並不允許創建比屏幕尺寸小的窗口;然而,如果您的窗口是通過編程方式創建的,則必須在創建時傳入期望的邊框矩形。除了屏幕矩形之外,沒有理由傳入其它邊框矩形。屏幕矩形可以通過UIScreen對象來取得,具體代碼如下所示:

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];

self.window.rootViewController = viewController;

//UIWindow有一個根視圖控制器—這個視圖控制器負責配置當窗體顯示時最先顯示的視圖。

[self.window makeKeyAndVisible];//這行代碼會讓包含了視圖控制器視圖的Window窗口顯示在屏幕上。


一、UIWindow是一種特殊的UIView,通常在一個程序中只會有一個UIWindow,但可以手動創建多個UIWindow,同時加到程序裏面。UIWindow在程序中主要起到三個作用:

  1、作爲容器,包含app所要顯示的所有視圖

  2、傳遞觸摸消息到程序中view和其他對象

  3、與UIViewController協同工作,方便完成設備方向旋轉的支持

二、通常我們可以採取兩種方法將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在顯示的時候會根據UIWindowLevel進行排序的,即Level高的將排在所有Level比他低的層級的前面。下面我們來看UIWindowLevel的定義:

    constUIWindowLevel UIWindowLevelNormal;
    constUIWindowLevel UIWindowLevelAlert;
    constUIWindowLevel UIWindowLevelStatusBar;
    typedef CGFloat UIWindowLevel;
  IOS系統中定義了三個window層級,其中每一個層級又可以分好多子層級(從UIWindow的頭文件中可以看到成員變量CGFloat _windowSublevel;),不過系統並沒有把則個屬性開出來。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類的實例,負責在屏幕上定義一個矩形區域。視圖在展示用戶界面及響應用戶界面交互方面發揮關鍵作用。每個視圖對象都要負責渲染視圖矩形區域中的內容,並響應該區域中發生的操作事件。視圖是應用程序與用戶交互的重要機制。

除了顯示內容和處理事件之外,視圖還可以用於管理一或多個子視圖。子視圖是指嵌入到另一視圖對象邊框內部的視圖對象,而被嵌入的視圖則被稱爲父視圖或超視圖。視圖的這種佈局方式被稱爲視圖層次,一個視圖可以包含任意數量的子視圖,通過爲子視圖添加子視圖的方式,視圖可以實現任意深度的嵌套。子視圖總是被顯示在其父視圖的上方。每個父視圖都負責管理其直接的子視圖,根據需要調整它們的位置和尺寸,以及響應它們沒有處理的事件。

在IOS中視圖和視圖控制器緊密協作,視圖控制器的作用是處理視圖的裝載與卸載、處理由於設備旋轉導致的界面旋轉,以及和用於構建複雜用戶界面的高級導航對象進行交互。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章