1. 程式人生 > >IOS View程式設計指南筆記

IOS View程式設計指南筆記

我們所看到的程式

對於一切IOS APP來說,我們看的的內容,都是UIView所呈現的。

UIView如場景,UIWindow如舞臺,UIView粉墨登場在UIWindow這個舞臺上,使我們看到豐富多彩的介面UI。UIWindow本身沒有任何內容,它只提供了一個場所來讓這些UIView來顯示,切換。

通常,一個APP僅有一個UIWindow作為顯示的場所,當我們要進行多屏顯示時,才會使用到多個UIWindow。

UIView的基本結構

1、UIView附著於UIWindow上,只有放在UIWindow上的View,才能被我們看到。

2、UIView本身又可作為容器顯示並管理SubView,使介面更豐富。

3、每個UIView都有一個對應的Core Animation Layer類物件作支援。Layer類物件一般是CALayer類物件。該物件儲存對應UIView物件的一些資訊資料,並處理UIView的動畫操作。

有了CALayer物件,主要會提供如下幾點作用:

(1)CALayer物件儲存了對應UIView物件的資訊資料,這可以使UIView的渲染次數大大減少,我們可以儘可能的直接讀取CALayer物件裡面的儲存的已經渲染過的資料,而不需要每次都要渲染UIView。

(2)正是因為CALayer物件儲存了UIView的資訊,才使得UIView的當前內容可以被操作,進而實現UIView的動畫效果。

(3)我們可以通過直接操作CALayer物件來實現更豐富靈活的顯示及動畫效果。

UIWindow, UIView, Core Animation Layer物件關係如下圖所示:


View的等級及SubView的管理

如前所述,UIView可以新增子View,進而形成superView,subView這樣的父子邏輯關係。

subView被父View放到一個子View佇列裡面進行管理。

view顯示的層級關係

最後加入的view會遮擋前面的view。

事件響應鏈(Event responder chain

當App獲取到使用者的操作事件後,會首先將該event傳遞給發生該事件最上層的subview,若該subview不響應該事件,則會傳遞至該view的superview進行響應,這樣一直傳遞下去,直到該事件被響應或由程式丟棄不處理為止。這就是所謂的Event responder chain。

View的內容繪製週期

在IOS中,UIView類採取一種按需策略來繪製View的顯示內容。所謂按需策略,就是指僅當你明確告知系統需要對View進行內容重繪時,系統才會呼叫你的繪製函式重新繪製VIew的內容,否則,系統在大多數情況下僅使用View的內容快照圖片來代替View的內容顯示。

具體實現如下:

1、當一個View第一次顯示在螢幕時,系統會自動呼叫View的繪製函式,完成內容顯示,同時,為內容保留一份快照圖片。

2、若View的內容不發生改變,則在大多數情況下,系統僅使用快照圖片來表示View內容。這裡注意,系統不會主動詢問是否View的內容發生了改變,需要你主動通知系統內容發生改變從而更新View顯示內容。

3、當你對View的內容做出了改變,呼叫

方法通知系統內容發生改變,需要重繪View介面。

4、系統得知內容發生改變後,不會立即重繪View介面,而是當這輪run loop結束,準備重繪內容時,才會對改變內容的View進行重繪。

5、當系統對View進行重繪時,流程並不是統一的。對於自定義的View而言,我們需要重寫

當然,也可以通過直接改變View對應的Layer物件的方式來改變View的內容。

6、當系統完成對View的重繪後,會採集一張新的內容快照來代表View的內容來用作多數時間的View顯示。

注意,一般的View的幾何形變(如拉伸縮小,不會引起內容重繪,而僅僅是內容快照的拉伸縮小)。

View的內容模式

如前所述,當View顯示在螢幕上後,系統會用一張快照來代替表示內容。

這會照成這麼一種情況,當我們更改View的frame等屬性時,其內容(內容快照),並不一定會同時改變。對於內容顯示的方式,取決於UIView物件的.預設的系統會採取UIViewContentModeScaleToFill模式,使內容快照拉伸填充滿整個View區域。Content Mode的幾個形式如下圖:


注意,當設定了View的ContentMode後,每一次View的幾何形變都會引起系統呼叫View的drawRect:方法來重繪View,因此應當避免使用該屬性,同時對於系統View,我們絕不應該用屬性。

View的座標系統

IOS系統的座標系統如下所示:


UIWindow, UIView都有自己的座標系統。對於UIView常用的屬性Frame,Bound,Center其屬性是相對於不同座標系統的。具體如下:

A view object tracks its size and location using its framebounds, and center :

  • The frame property contains the frame rectangle, which specifies the size and location of the view in its superview’s coordinate system. 

  • The  property contains the bounds rectangle, which specifies the size of the view (and its content origin) in the view’s own local coordinate system. 

  • The  property contains the known center point of the view in the superview’s coordinate system.

總結一下,就是view的frame,center屬性其座標系統均是對於其superview的座標系統來說的。而bounds屬性,則是對其自己的座標系統來說的。 Frame, Center, Bounds的相互關係 Frame,Center都是相對view的superview座標系統來說的,所以可以用作subview在superview中的定位與大小。對於位移運動,推薦改變Center屬性來實現,因為Frame屬性在一些變形中是不存在的。 Frame,Center,Bounds互相影響著對方,具體如下:
  • When you set the frame property, the size value in the bounds property changes to match the new size of the frame rectangle. The value in the center property similarly changes to match the new center point of the frame rectangle.

  • When you set the center property, the origin value in the frame changes accordingly.

  • When you set the size of the bounds property, the size value in the frame property changes to match the new size of the bounds rectangle.

View的Runtime互動模型

我們可以通過觸控等動作,和view進行實時的互動。 IOS系統中,使用者動作與View的互動模型大致如下: 1、使用者觸控式螢幕幕,該事件硬體識別,並被髮給了UIKit Framework。 2、該觸控事件被UIKit Framework包裝成UIEvent類物件,併發給對應的事件響應View。 3、在事件響應View中,我們可以通過對應的函式,來捕獲到當前的UIEvent事件(手勢識別機制或重寫touch系列響應函式)。 4、在View中我們自定義程式碼做出響應,如:
  • 更改UIView的屬性,或通知某個controller物件。

關於View使用的Tips

Apple官方對View的使用做出若干建議,個人感覺比較重要的摘要如下: 1、儘量設定View的Opaque屬性為YES。當View的Opaque屬性設定為YES時,UIKit框架就不會在去檢查View後面是否有可以渲染的東西(因為你已經明確說明該View是不透明的),提高UIKit框架渲染速度。 2、不要在已有的UIControlr物件中新增subview。我們對於UIControl物件的使用,應該儘量保持原生態。雖然對UIControl新增自己的subview技術是可行的,但這麼做是危險的。因為當Apple更新版本時,UIControl物件的實現細節可能會改變,而導致我們添加了subview的程式執行失敗。 參考資料: Apple官方文件 View Programming Guide for iOS