核心動畫程式設計(二)

Crazy巴旦木發表於2018-08-08

所有知識點均來著《核心動畫程式設計指南》 五.提供圖層內容 給CALayer提供內容 1.使用包含圖片內容的CGImageRef來顯示的設定圖層的contents的屬性。

2.指定一個委託,它提供或重繪內容。

3.繼承CALayer類過載顯示的函式。

設定contents屬性 myLayer.contents = theImage;

通過委託提供內容 繪製圖片的內容,建立委託類實現:displayLayer:或drawLayer:inContext:

實現委託重繪的方法並不意味會自動的觸發圖層使用實現的方法來重繪內容。而是你要顯式的告訴一個圖層例項來重新快取內容,通過傳送以下任何一個方法setNeedsDisplay或 者setNeedsDisplayInRect: 的 消 息 , 或 者 把 圖 層 的needsDisplayOnBoundsChange屬性值設定為 YES。

displayerLayer:方法根據state的值設定theLayer的contents屬性。子類不需要儲存state的值,因為CALayer的例項是一個鍵-值編碼容器。

如果你必須重繪圖層的內容,而不是通過載入圖片,那你需要實現drawLayer:inContext:方法。通過委託可以決定哪些內容是需要的並使用CGContextRef來重繪內容。

通過子類供圖層的內容 可以繼承CALayer直接過載重繪和顯示方法。這個通常發生在你的圖層需要定製行為而委託又無法滿足需求的時候。

CALayer子類可以通過過載drawInContext:繪製圖層的內容到一個圖形上下文。

繼承CALayer並且實現其中的重繪方法並不意味重繪會自動發生。你必須顯式的促使例項重新快取其內容,可以通過傳送以下任何一個方法setNeedsDisplay或setNeedsDisplayInRect:的訊息,亦或者設定圖層的needsDisplaOnBoundsChange屬性為 YES。

修改圖層內容的位置 CALayer的屬性contentsGravity允許你在圖層的邊界內容修改圖層的contents圖片的位置或者伸縮值。預設情況下,內容的影象完全填充層的邊界,忽視自然的影象寬高比。使用contentsGravity位置常量,你可以指定圖片位於圖層任何一個邊界,比如位於圖層的角落,或者圖層邊界的中心。

六.動畫 動畫類和時序 CABasicAnimation提供了在圖層的屬性值間的簡單插入。

CAKeyframeAnimation提供支援關鍵幀動畫。指定動畫的一個圖層屬性的關鍵路徑,一個表示在動畫的每個階段的價值的陣列,還有一個關鍵幀時間的陣列和時間函式。

CATransition提供了一個影響整個圖層的內容過渡效果。在動畫顯示過程中採用淡出,推出,顯露圖層的內容。

還必須指定動畫的間隔,速度點,迴圈次數,週期完成是否自動反轉,動畫結束的視覺化狀態。

隱式動畫 核心動畫的隱式動畫模型假定所有動畫圖層屬性的變化應該是漸進的和非同步的。動態的動畫場景可以在沒有顯式的動畫圖層時候實現。改變可動畫顯示的圖層的屬性將會導致圖層隱式把圖層從舊的值動畫顯示為新的值。雖然動畫是持續的,但是設定新的目標值時會導致圖層從當前狀態動畫過渡到新的目標值。

顯式動畫 該顯式動畫模型需要你建立一個動畫物件,並設定開始和結束的值。顯式動畫不會開始執行,直到你把該動畫應用到某個圖層上面。顯式動畫對於建立連續執行的動畫非常有幫助。

開始和結束顯式動畫 你可以傳送addAnimation:forKey:訊息給目標圖層來開始一個顯式動畫,把動畫和識別符號作為引數。一旦把動畫新增到目標圖層,動畫將會一直執行直到動畫完成,或者動畫被從圖層上面移除。把動畫新增到圖層時新增的識別符號,同樣也可以在停止動畫的時候使用,通過調removeAnimationForKey:。你可以通過給圖層傳送一個removeAllAnimations訊息來停止圖層所有動畫。

七.圖層的行為 圖層的行為在以下情況發生的時候被觸發:從圖層樹裡面插入或者刪除一個圖層,圖層的屬性值被修改了,或者程式顯式要求。

行為物件的角色 一個行為物件是一個通過CAAction協議響應行為識別符號的物件。行為識別符號使用標準圓點分割的關鍵路徑來命名。圖層負責把行為識別符號對映到特定的行為物件。當一個特定識別符號的行為物件被確定的時候,它會傳送一個CAAction協議定義的訊息。

已定義搜尋模式的行為鍵值 當一個行為觸發器發生的時候,圖層的actionForKey:方法被呼叫。此方法返回一

個行為物件,對應的識別符號作為引數,或如果行為物件不存在的話返回nil。

當CALayer為一個識別符號實現的actionForKey:方法被呼叫的時候,以下的搜尋

模式將會被用到:

  1. 如果一個圖層有委託,那方法 actionForLayer:forKey:的實現將會被呼叫,

把圖層和行為識別符號作為引數。委託的 actionForLayer:forKey:的實現需要

響應如下:

2011-11-14 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved.[33]

Core Animation Programming Guide

返回一個行為識別符號對應的行為物件。

返回nil,當無法處理行為識別符號的時候。

返回NSNull,當無法處理行為識別符號,而且搜尋需要被終止的時候。

  1. 圖層的 actions 字典被搜尋以便找到一個和行為識別符號對應的物件。

  2. 圖層的 style 屬性被搜尋以便找到一個包含行為識別符號的 actions 字典。4. 圖層類發生一個 defaultActionForKey:的訊息。它將會返回一個和識別符號對

應的行為物件,如果不存在的話則返回 nil。

採用CAAction協議 CAAction協議定義了行為物件如何被呼叫。實現CAAction協議的類包含一個方法runActionForKey:object:arguments:。

當行為物件收到一個runActionForKey:object:arguments:的訊息時,行為識別符號,行為發生所在的圖層,額外的引數字典會被作為引數傳遞給方法。

通常行為物件是CAAnimation的子類例項,實現了CAAction協議。然而你也可以返回任何實現了CAAction協議的類物件。當例項收到runActionForKey:object:arguments:的訊息,它需要執行相應的行為。

過載隱式動畫 你可以為行為識別符號 供隱式的動畫,通過插入一個CAAnimation的例項到style字典裡面的actions的字典裡面,通過實現委託方法actionForLayer:forKey:或者繼承圖層類並過載defaultActionForKey:方法返回一個相應的行為物件。

暫時禁用行為 預設情況下,你任何時候改變一個可動畫顯示的屬性時,相應的動畫將會伴隨發生。

在修改圖層屬性的時候,你可以通過使用事務暫時禁用行為。檢視“暫時禁用圖層的行為”部分來獲取更多資訊。

八.事物 隱式事物 當圖層樹被沒有獲得事物的執行緒修改的時候將會自動建立隱式事物,當執行緒的執行迴圈(run-loop)執行下次迭代的時候將會自動提交事物。

當在一個沒有執行runloop的執行緒修改圖層的屬性時,你必須使用顯示的事物。

相關文章