UIView

1.什么叫UIView?

視圖。在iPhone里看到的,摸到的都是UIView。每個UI控件都繼承了UIView 視圖和窗口展示了應用的用戶界面,同時負責界面的交互,大部分你想要的可視化操作都是由視圖對象-即UIView類的實例來進行的。

視圖與Core Animation層聯(lián)合起來處理著屬兔內容的解釋和動畫過度,每個UIKit框架里的視圖都被一個層的對象支持(通常是一個CALayer類的實例),它管理著后臺的視圖存儲和處理視圖相關的動畫。然而,當你需要對視圖的解釋和動畫行為有更多的控制權時,你可以使用層。

2.UIView與UIWindow的聯(lián)系

UIWindow是一種特殊的UIView,通常在一個App中只會有一個UIWindow。iOS程序啟動后,創(chuàng)建的第一個就是視圖控件UIWindow,接著創(chuàng)建控制器的view,接著將控制器的view添加到UIWindow上,這樣控制器的view就能顯示到屏幕上了。

UIWindow是創(chuàng)建的第一個視圖控件,創(chuàng)建的第一個對象是UIAppliation

3.UIView的生命周期

到目前為止,我們已經(jīng)了解了每個方法的作用,接下來就把整個流程梳理一遍。

-[ViewController initWithCoder:]或-[ViewController initWithNibName:Bundle]:首先從歸檔文件中加載UIViewController對象。即使是純代碼,也會把nil作為參數(shù)傳給后者。

-[UIView awakeFromNib]:作為第一個方法的助手,方便處理一些額外的設置。

-[ViewController loadView]:創(chuàng)建或加載一個view并把它賦值給UIViewController的view屬性

-[ViewController viewDidLoad]:此時整個視圖層次(view hierarchy)已經(jīng)被放到內存中,可以移除一些視圖,修改約束,加載數(shù)據(jù)等

-[ViewController viewWillAppear:]:視圖加載完成,并即將顯示在屏幕上,還沒有設置動畫,可以改變當前屏幕方向或狀態(tài)欄的風格等。

-[ViewController viewWillLayoutSubviews]:即將開始子視圖位置布局

-[ViewController viewDidLayoutSubviews]:用于通知視圖的位置布局已經(jīng)完成

-[ViewController viewDidAppear:]:視圖已經(jīng)展示在屏幕上,可以對視圖做一些關于展示效果方面的修改。

-[ViewController viewWillDisappear:]:視圖即將消失

-[ViewController viewDidDisappear:]:視圖已經(jīng)消失

如果考慮UIViewController可能在某個時刻釋放整個view。那么再次加載視圖時顯然會從步驟3開始。因為此時的UIViewController對象依然存在。

4.UIView和CALayer的區(qū)別聯(lián)系

view是對layer的一種封裝,你對view的很多操作事實上是對layer的操作,之所以會出現(xiàn)這兩個東西是因為

1、首先UIView可以響應事件,Layer不可以.

view支持很多手勢的交互,你所操作iphone的各種點擊,拖動等等。

2、layer來至于mac os,是可以跨平臺的東西。這里就是個很要學問的東西,系統(tǒng)的可變部分和不可變部分,可變部分越多,系統(tǒng)越不穩(wěn)定,但是功能就更加豐富。layer就是作為一種不可變的東西存在,view作為一種可變的東西存在,所有我們每次在ios更新時候獲得了大量的view新特性,但是整個view系統(tǒng)底層很多東西依舊可以接著使用,各種動畫等。這就是分開view和layer的功勞。

UIKit使用UIResponder作為響應對象,來響應系統(tǒng)傳遞過來的事件并進行處理。UIApplication、UIViewController、UIView、和所有從UIView派生出來的UIKit類(包括UIWindow)都直接或間接地繼承自UIResponder類。在UIResponder中定義了處理各種事件和事件傳遞的接口。而CALayer直接繼承NSObject,并沒有相應的處理事件的接口。

總結如下幾點:

每個 UIView 內部都有一個 CALayer 在背后提供內容的繪制和顯示,并且 UIView 的尺寸樣式都由內部的 Layer 所提供。兩者都有樹狀層級結構,layer 內部有 SubLayers,View 內部有 SubViews.但是 Layer 比 View 多了個AnchorPoint

在 View顯示的時候,UIView 做為 Layer 的 CALayerDelegate,View 的顯示內容由內部的 CALayer 的 display

CALayer 是默認修改屬性支持隱式動畫的,在給 UIView 的 Layer 做動畫的時候,View 作為 Layer 的代理,Layer 通過 actionForLayer:forKey:向 View請求相應的 action(動畫行為)

layer 內部維護著三分 layer tree,分別是 presentLayer Tree(動畫樹),modeLayer Tree(模型樹), Render Tree (渲染樹),在做 iOS動畫的時候,我們修改動畫的屬性,在動畫的其實是 Layer 的 presentLayer的屬性值,而最終展示在界面上的其實是提供 View的modelLayer

兩者最明顯的區(qū)別是 View可以接受并處理事件,而 Layer 不可以

UIView屬性:

frame - 你可以使用這個來動畫的改變視圖的尺寸和位置

bounds - 使用這個可以動畫的改變視圖的尺寸

center - 使用這個可以動畫的改變視圖的位置,定義控件的中心點

transform - 使用這個可以翻轉或者放縮視圖

alpha - 使用這個可以改變視圖的透明度

backgroundColor - 使用這個可以改變視圖的背景顏色

contentStretch - 使用這個可以改變視圖內容如何拉伸

tag - 可以定義控件的標識,它既可以定義控件的位置,也可以定義控件的大小

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容