核心動畫使用action對象實現它的可視化動畫。一個action對象是指遵循CAAction協議並定義了Layer相關的動畫行爲的對象。全部的CAAnimation對象實現了這個協議,不管什麼時候Layer的屬性發生變化的時候就會執行對應的action對象(包含CAAnimation對象)。
可動畫的屬性是action的一種類型,咱們能夠定義幾乎全部咱們想要的actions,爲了達成這個目的,咱們就須要定義本身的action並把它們關聯到Layer對象html
爲了建立咱們本身的action對象,須要讓咱們的類遵照CAAction協議並實現runActionForKey:object:arguments: 方法。在這個方法中使用可用的信息執行任何咱們想要在相應的Layer上執行的action。咱們可能使用這個方法將動畫對象添加到相應的Layer上,或者使用它去執行其餘的任務。
當咱們定義一個action對象的時候,咱們必須設定這個action將如何被觸發的方式。Action的觸發方式是須要定義一個Key,咱們而後使用這個Key註冊該action。Action對象可以經過下面任何一種情景觸發:app
在action可以被執行前,Layer須要先找到對應的要執行的action。(和Layer相關的action)Key是正在被改變的屬性名或者定義該action的特殊字符串。當某個事件發生在Layer上的時候,Layer會調用actionForKey:方法經過相應的Key搜索action對象;在搜索期間,咱們APP中能夠在如下幾個地方插入代碼,併爲那個Key提供相關的action對象。
核心動畫按照下面的順序查找action對象:動畫
若是咱們在上述搜索的地方提供action對象,Layer將會中止搜索並執行所返回的action對象。當他找到action對象,Layer會調用那個對象的runActionForKey:object:arguments: 方法執行動畫。若是咱們定義的action對象是某個CAAnimation類的實例,咱們可使用那個方法的默認實現執行動畫;若是是咱們自定義的遵照CAAction協議的對象,就必須讓自定義的對象去實現那個方法來執行動畫。
咱們在那替換爲本身寫的action對象取決於咱們打算如何調整Layer。代理
- (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(咱們能夠臨時禁止Layer的actions。當咱們改變Layer的屬性,核心動畫一般建立隱式的transaction對象,而後執行動畫式的過分變化;若是咱們不想要這個默認的動畫執行,經過建立顯式的transaction和設置他的 kCATransactionDisableActions 屬性爲true,就能夠達到禁止隱式動畫的目的了。代碼6-2展現了當從圖層樹上移除指定的Layer的時候,咱們禁止隱式動畫的一段代碼。code
[CATransaction begin]; [CATransaction setValue:(id)kCFBooleanTrue forKey:kCATransactionDisableActions]; [aLayer removeFromSuperlayer]; [CATransaction commit];
關於更多使用transaction對象管理動畫行爲的信息參見:顯式動畫幫助咱們改變更畫參數。htm