原文鏈接:http://blog.csdn.net/jinnchang/article/details/44954803
1、前言
我們先來看一下這幾個概念的類繼承關係圖:iOS 中,所有顯示在界面上的對象都是從 UIResponder 直接或間接繼承的。
2、應用程序(UIApplication)
一個 UIApplication 對象就代表一個應用程序。一個 iOS 程序啓動後創建的第一個對象就是 UIApplication 對象(只有一個),而且是單例的。如有需要,可以通過如下代碼獲取該單例對象:
利用 UIApplication 對象,可以進行一些應用級別的操作。
3、視圖(UIView)
UIView 的實例即視圖,負責在屏幕上定義一個矩形區域,同時處理該區域的繪製和觸屏事件。視圖可以嵌套,也可以像圖層一樣進行疊加。像 UITableView、UIButton 等都是UIView 的子類。
4、窗口(UIWindow)
UIWindow 管理和協調應用程序的顯示,雖然 UIWindow 繼承自 UIView,但通常不直接操作 UIWindow 對象中與視圖相關的屬性變量。
iOS 程序啓動完畢後,創建的第一個視圖控件就是 UIWindow(創建的第一個對象是 UIApplication),接着創建控制器的 view,最後將控制器的 view 添加到 window 上,於是控制器的 view 就顯示在屏幕上了。一般情況下,應用程序只有一個 UIWindow 對象,即使有多個,也只有一個 UIWindow 可以接受到用戶的觸屏事件。
(1)自定義一個 window
(2)設置 window 爲主窗口並顯示出來(view 不能憑空顯示,必須依賴 window)
UIWindow 和 UIView 之間的關係也可以想象成這樣一個場景:首先會有一個空的畫框(UIWindow),我們在畫框上放置一塊畫布(UIView),然後可以在這個畫布上進行繪畫。畫布上可能會被畫上各種元素,例如 UILabel、UIButton 等,這些元素其實也是一個又一個 UIView,它們會有一個層級關係管理,有點類似於 Photoshop 中圖層的概念,層級高的元素會覆蓋住層級低的元素,從而導致層級低的元素被部分或完全遮擋。
5、屏幕(UIScreen)
通過這個類我們可以獲取一些關於屏幕的信息,通常用來獲取屏幕尺寸。
6、視圖控制器(UIViewController)
視圖控制器管理 UIView 實例的生命週期及資源的加載與釋放、處理由於設備旋轉導致的界面旋轉、以及和用於構建複雜用戶界面的高級導航對象進行交互。
下圖展示了 UIView、UIWindow、UIScreen、UIViewController 之間的層級關係:
7、容器(Container)
一個 app 可能有很多的 UIViewController 組成,這時需要一個容器來對這些 UIViewController 進行管理。大部分的容器也是一個 UIViewController,如 UINavigationController、UITabBarController,也有少數不是 UIViewController,比如 UIPopoverController 等。
UINavigationController 繼承自 UIViewController,通常我們新建的工程是直接將視圖控制器添加到 window 上的,如果添加了 navigation 以後就多了一層。