UIView 與 UIWindow的關係

面對iOS初學者,總會被問到一些不常被關注的問題,比如: UIView 與 UIWindow是什麼關係? 誰繼承的誰? 從字面意思來看,貌似UIWindow 是UIView 的父類, 按說,應該是先有窗口,再有視圖? 果真如此麼?

事實上, UIView 繼承於 UIWindow, 由Apple的官方文檔爲證。 如下圖。
iOS之美: UIView 與 UIWindow之間的關係 - 悠悠電臺 - 悠悠電臺——移動流媒體收音機

UIWindow繼承自UIView,關於這一點可能有點邏輯障礙,畫框怎麼繼承自畫布呢?視圖怎麼繼承於窗口呢? 雖說UIWindow 繼承於UiView, 但這個 UIWindow 也是一個重中之重的View。 這裏,打個比方: UIWindow 雖說也是個View,但它是一個首席View。

看一下App的初始化過程吧:

在application didFinishLauchingWithOptions裏面, 有下面一段code。

self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
self.window.backgroundColor = [UIColor grayColor]; //給window設置一個背景色
[self.window makeKeyAndVisible]; //讓window顯示出來

首先創建一個Window, 之後纔在 Window 之上疊加多個View.

UIView的使用方法
一個 UIView 裏面可以包含許多的 Subview(其他的 UIView),而這些 Subview 彼此之間是有層級關係的。這有點像PS(photoshop)中的圖層的概念。下面的代碼,演示了View 管理常用的方法:

1.首先是大家最常使用的新增和移除Subview。

[Subview removeFromSuperview]; //將Subview從當前的UIView中移除
[UIView addSubview:Subview]; //替UIView增加一個Subview

2.在UIView中將Subview往前或是往後移動一個圖層,往前移動會覆蓋住較後層的 Subview,而往後移動則會被較上層的Subview所覆蓋。

[UIView bringSubviewToFront:Subview]; //將Subview往前移動一個圖層(與它的前一個圖層對調位置)//將Subview往前移動一個圖層(與它的前一個圖層對調位置)
[UIView sendSubviewToBack:Subview]; //將Subview往後移動一個圖層(與它的後一個圖層對調位置)

3.在UIView中使用索引Index交換兩個Subview彼此的圖層層級。
[UIView exchangeSubviewAtIndex:indexA withSubviewAtIndex:indexB]; //交換兩個圖層

4.使用Subview的變數名稱取得它在UIView中的索引值(Index )。

NSInteger index = [[UIView subviews] indexOfObject:Subview名稱]; //取得Index

5.爲Subview加上NSInteger 標記(Tag),以便後續區分不同的View。
[Subview setTag:NSInteger]; //加上標記
[UIView viewWithTag:NSInteger]; //通過標記得到view 返回值爲UIView

6.最後是取得UIView中所有的Subview,調用此方法會傳回一個 NSArray,並按照從後往前的順序列出這些 Subview,以下代碼列出Root中所有Subview。

[UIView subviews] ; //取的UIView下的所有Subview

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