Core Animation 文檔翻譯 (第七篇)—改變Layer的默認動畫

前言


核心動畫使用action對象實現它的可視化動畫。一個action對象是指遵循CAAction協議並定義了Layer相關的動畫行爲的對象。全部的CAAnimation對象實現了這個協議,不管什麼時候Layer的屬性發生變化的時候就會執行對應的action對象(包含CAAnimation對象)。
可動畫的屬性是action的一種類型,咱們能夠定義幾乎全部咱們想要的actions,爲了達成這個目的,咱們就須要定義本身的action並把它們關聯到Layer對象html

 

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


爲了建立咱們本身的action對象,須要讓咱們的類遵照CAAction協議並實現runActionForKey:object:arguments: 方法。在這個方法中使用可用的信息執行任何咱們想要在相應的Layer上執行的action。咱們可能使用這個方法將動畫對象添加到相應的Layer上,或者使用它去執行其餘的任務。
當咱們定義一個action對象的時候,咱們必須設定這個action將如何被觸發的方式。Action的觸發方式是須要定義一個Key,咱們而後使用這個Key註冊該action。Action對象可以經過下面任何一種情景觸發:app

  • Layer的屬性被改變時。這能夠是Layer的任意一個屬性而且能夠是不可動畫的屬性,(咱們也能將actions關聯到咱們爲Layer添加的自定義屬性。)那麼定義這個action的Key就是屬性的名稱。
  • 當Layer變爲可視化或者是被添加到圖層時,此action的key是kCAOnOrderIn
  • 當Layer從圖層中移除的時候,此action的Keys是kCAOnOrderOut
  • 當Layer將要開始transition動畫時,此action的key是KCATransition

 

爲了產生特定效果,action對象必須存在於Layer中


在action可以被執行前,Layer須要先找到對應的要執行的action。(和Layer相關的action)Key是正在被改變的屬性名或者定義該action的特殊字符串。當某個事件發生在Layer上的時候,Layer會調用actionForKey:方法經過相應的Key搜索action對象;在搜索期間,咱們APP中能夠在如下幾個地方插入代碼,併爲那個Key提供相關的action對象。
核心動畫按照下面的順序查找action對象:動畫

  1. 若是Layer對象有代理而且那個代理實現了actionForLayer:forKey:方法,Layer會調用這個方法。代理必須完成下面所列的其中之一:
    • 返回指定的Key對應的action對象。
    • 若是該代理方法中不處理此Key相關的action,則返回nil,這種狀況下會繼續搜索看監控監控就看見看監控監控就看見看監控監控就看見看監控監控。
    • 返回NSNull對象,此時,搜索會當即結束。
  2. Layer對象會在Layer的actions字典中根據指定的Key進行查找。
  3. Layer對象查找style字典獲取包含該Key的actions字典(換句話說,style字典包含了一個actions的key對應的value,而這個value也是個字典,Layer會根據Key在這個value字典中查詢。)
  4. Layer調用defaultActionForKey:類方法。
  5. 若是查找到隱式的action,Layer執行核心動畫定義的隱式的action。

若是咱們在上述搜索的地方提供action對象,Layer將會中止搜索並執行所返回的action對象。當他找到action對象,Layer會調用那個對象的runActionForKey:object:arguments: 方法執行動畫。若是咱們定義的action對象是某個CAAnimation類的實例,咱們可使用那個方法的默認實現執行動畫;若是是咱們自定義的遵照CAAction協議的對象,就必須讓自定義的對象去實現那個方法來執行動畫。
咱們在那替換爲本身寫的action對象取決於咱們打算如何調整Layer。代理

  • 對於咱們僅僅想應用到特殊環境的actions,或者對於已經使用代理的Layer,只須要提供代理並實現它的actionForLayer:forKey:方法。
  • 對於沒有正常使用代理的Layer對象,須要爲layer的actions字典添加相應的Key和action。
  • 對於在Layer對象中自定義屬性相關的actions,須要將action添加到Layer的style字典中。
  • 對於和Layer基本的動畫的actions,繼承Layer類,並重寫defaultActionForKey:方法。
    代碼6-1展現了用於提供action對象的代理方法的實現。這種狀況是,代理查找Layer的contents屬性,使用心得contents替換掉舊的,並使用transition動畫。
代碼6-1 使用Layer的代理提供一個action
- (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(咱們能夠臨時禁止Layer的actions。當咱們改變Layer的屬性,核心動畫一般建立隱式的transaction對象,而後執行動畫式的過分變化;若是咱們不想要這個默認的動畫執行,經過建立顯式的transaction和設置他的 kCATransactionDisableActions 屬性爲true,就能夠達到禁止隱式動畫的目的了。代碼6-2展現了當從圖層樹上移除指定的Layer的時候,咱們禁止隱式動畫的一段代碼。code

臨時禁止Layer的actions
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
                 forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];

關於更多使用transaction對象管理動畫行爲的信息參見:顯式動畫幫助咱們改變更畫參數htm

相關文章
相關標籤/搜索