[譯] Core Animation 編程指南 - 改變圖層默認行爲

本文首發地址html

Core Animation 使用 action 對象實現圖層的隱式動畫行爲。action 對象遵照 CAAction 協議,並定義一些在圖層上執行的相關行爲。全部的 CAAnimation 對象實現了該協議,而且這些對象一般被分配在圖層屬性改變時執行。git

動畫屬性是 action 的一種類型,你也能夠定義任何包含你想要的行爲的 action 。但爲了實現該目的,你必須定義本身的 action 對象,並將它們與你 app 的圖層對象關聯。github

自定義的 Action 對象遵照 CAAction 協議

去建立你本身的 action 對象,使你的類遵照 CAAction 協議,並實現 runActionForKey:object:arguments: 方法。在該方法中,使用可用的信息去執行你想在圖層上應用的 actions 。你可能使用該方法給圖層添加一個動畫對象,或執行其餘的任務。bash

當你定義 action 對象時,你必須決定 action 怎樣被觸發。觸發器爲 action 定義鍵,後面你使用該鍵註冊 action。Action 對象在下面的狀況下會被觸發:app

  • 圖層的屬性值改變時,能夠是圖層的任意屬性,不只是能夠動畫的屬性。(你也能夠將你給圖層添加的自定義屬性與 action 關聯。)識別 action 的鍵就是屬性的名字。
  • 圖層變爲可見的或被添加到圖層層級結構中。識別 action 的鍵是 kCAOnOrderIn
  • 圖層從圖層層級結構中被移除。識別 action 的鍵是 kCAOnOrderOut
  • 圖層即將參與過渡動畫。識別 action 的鍵是 kCATransition

Action 對象必須安裝在圖層上才能生效

在 action 可被執行以前,圖層對象須要尋找響應的 action 對象去執行。圖層相關的 actions 的鍵是被修改屬性的名字,或可識別 action 的一個特別的字符串。當圖層上發生合適的事件時,圖層會調用 actionForKey: 方法去用於 action 對象關聯的鍵去搜索 action 對象。在搜索過程當中,你的 app 能夠在幾個點插入本身,併爲該鍵提供相關的 action 對象。ide

Core Animation 經過下面的順序查找 action 對象:動畫

  1. 若是圖層有 delegate,而且 delegate 實現了 actionForLayer:forKey: 方法,圖層調用該方法。delegate 必須作下面的其中一個:ui

    1. 經過給的鍵返回 action 對象。
    2. 若是它沒有處理 action,返回 nil。該狀況下搜索繼續。
    3. 返回 NSNull 對象,該狀況下搜索當即結束。
  2. 圖層在圖層 actions 字典中查詢給定的鍵。spa

  3. 圖層在 style 字典中查詢包含鍵的 actions 字典。(換言之,style 字典包含 actions 鍵,其值也是字典 。圖層在第二個字典中,用給定的鍵去查詢。)code

  4. 圖層調用 defaultActionForKey: 類方法。

  5. 圖層執行由 Core Animation 定義的隱式 action (若是有的話)。

若是你在任意合適的搜索點提供了一個 action 對象,圖層會中止搜索,並執行返回的 action 對象。它發現一個 action 對象時,圖層調用對象的 runActionForKey:object:arguments: 方法去執行該 action。若是你對於給定的鍵定義的 action 已是 CAAnimation 的實例,你可使用默認的實現去執行動畫。若是你定義你本身的自定義對象遵照了 CAAction 協議,你必須使用該方法的對象實現來採起任何適當的操做。

你在哪安裝 action 對象取決於你想如何修改圖層。

  • 對於只想應用某些具體狀況的 action,或已經使用 delegate 對象的圖層,提供 delegate 並實現它的 actionForLayer:forKey: 方法。
  • 對於一般不使用委託的圖層對象,請將 action 添加到圖層的 actions 字典中。
  • 對於與在圖層對象上定義的自定義屬性相關的 action ,請將該 action 包含在圖層的 style 字典中。
  • 對於對圖層行爲相當重要的 action,對圖層進行子類化,並重寫 defaultActionForKey: 方法。

例 6-1 展現了使用提供的 action 對象的 delegate 方法的實現。在這種狀況下,delegate 查找圖層 contents 屬性的改變,而且使用過渡動畫將新內容交換到相應位置。

例 6-1 使用圖層委託對象提供

- (id<CAAction>)actionForLayer:(CALayer *)theLayer
                        forKey:(NSString *)theKey {
    CATransition *theAnimation=nil;
 
    if ([theKey isEqualToString:@"contents"]) {
 
        theAnimation = [[CATransition alloc] init];
        theAnimation.duration = 1.0;
        theAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn];
        theAnimation.type = kCATransitionPush;
        theAnimation.subtype = kCATransitionFromRight;
    }
    return theAnimation;
}
複製代碼

使用 CATransaction 類將 Actions 暫時禁用

你可使用 CATransaction 類暫時禁用圖層的 actions 。你改變圖層屬性時, Core Animation 一般建立一個隱式事務對象去動畫改變。若是你不想動畫改變,你能夠經過建立一個顯式事務,而且將 kCATransactionDisableActions 屬性設置爲 true 來禁用隱式動畫。例 6-2 展現了從圖層樹移除指定圖層時,若是用代碼禁用動畫。

例 6-2 暫時禁用圖層的 actions

[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
複製代碼

關於使用事務對象管理動畫行爲的更多信息,請參見顯示事務容許你改變更畫參數

相關文章
相關標籤/搜索