本文首發地址html
Core Animation 使用 action 對象實現圖層的隱式動畫行爲。action 對象遵照 CAAction
協議,並定義一些在圖層上執行的相關行爲。全部的 CAAnimation 對象實現了該協議,而且這些對象一般被分配在圖層屬性改變時執行。git
動畫屬性是 action 的一種類型,你也能夠定義任何包含你想要的行爲的 action 。但爲了實現該目的,你必須定義本身的 action 對象,並將它們與你 app 的圖層對象關聯。github
去建立你本身的 action 對象,使你的類遵照 CAAction 協議,並實現 runActionForKey:object:arguments:
方法。在該方法中,使用可用的信息去執行你想在圖層上應用的 actions 。你可能使用該方法給圖層添加一個動畫對象,或執行其餘的任務。bash
當你定義 action 對象時,你必須決定 action 怎樣被觸發。觸發器爲 action 定義鍵,後面你使用該鍵註冊 action。Action 對象在下面的狀況下會被觸發:app
kCAOnOrderIn
。kCAOnOrderOut
。kCATransition
。在 action 可被執行以前,圖層對象須要尋找響應的 action 對象去執行。圖層相關的 actions 的鍵是被修改屬性的名字,或可識別 action 的一個特別的字符串。當圖層上發生合適的事件時,圖層會調用 actionForKey:
方法去用於 action 對象關聯的鍵去搜索 action 對象。在搜索過程當中,你的 app 能夠在幾個點插入本身,併爲該鍵提供相關的 action 對象。ide
Core Animation 經過下面的順序查找 action 對象:動畫
若是圖層有 delegate,而且 delegate 實現了 actionForLayer:forKey:
方法,圖層調用該方法。delegate 必須作下面的其中一個:ui
圖層在圖層 actions 字典中查詢給定的鍵。spa
圖層在 style
字典中查詢包含鍵的 actions 字典。(換言之,style
字典包含 actions
鍵,其值也是字典 。圖層在第二個字典中,用給定的鍵去查詢。)code
圖層調用 defaultActionForKey:
類方法。
圖層執行由 Core Animation 定義的隱式 action (若是有的話)。
若是你在任意合適的搜索點提供了一個 action 對象,圖層會中止搜索,並執行返回的 action 對象。它發現一個 action 對象時,圖層調用對象的 runActionForKey:object:arguments:
方法去執行該 action。若是你對於給定的鍵定義的 action 已是 CAAnimation
的實例,你可使用默認的實現去執行動畫。若是你定義你本身的自定義對象遵照了 CAAction
協議,你必須使用該方法的對象實現來採起任何適當的操做。
你在哪安裝 action 對象取決於你想如何修改圖層。
actionForLayer:forKey:
方法。actions
字典中。style
字典中。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 。你改變圖層屬性時, Core Animation 一般建立一個隱式事務對象去動畫改變。若是你不想動畫改變,你能夠經過建立一個顯式事務,而且將 kCATransactionDisableActions
屬性設置爲 true 來禁用隱式動畫。例 6-2 展現了從圖層樹移除指定圖層時,若是用代碼禁用動畫。
例 6-2 暫時禁用圖層的 actions
[CATransaction begin];
[CATransaction setValue:(id)kCFBooleanTrue
forKey:kCATransactionDisableActions];
[aLayer removeFromSuperlayer];
[CATransaction commit];
複製代碼
關於使用事務對象管理動畫行爲的更多信息,請參見顯示事務容許你改變更畫參數。