CAMediaTiming協(xié)議
CAMediaTiming協(xié)議定義了在一段動畫內(nèi)用來控制逝去時間的屬性的集合。
-
duration和repeatCount是CAMidiaTiming的屬性,默認(rèn)為0.25秒和一次。 -
speed,是時間的倍數(shù),假定一個duration為1的動畫,如果speed為2,那么實際上0.5s就完成了動畫 -
beginTime指定動畫開始之前的延遲時間,設(shè)置為延遲1s,例:CACurrentMediaTime()+1 -
timeOffset是將動畫快進(jìn)到某一點,改變動畫過程中的起始點 -
fillMode,需要將removedOnCompletion設(shè)置為NO
kCAFillModeRemoved 這個是默認(rèn)值,也就是說當(dāng)動畫開始前和動畫結(jié)束后,動畫對layer都沒有影響,動畫結(jié)束后,layer會恢復(fù)到之前的狀態(tài)
kCAFillModeForwards 當(dāng)動畫結(jié)束后,layer會一直保持著動畫最后的狀態(tài)
kCAFillModeBackwards 這個和kCAFillModeForwards是相對的,就是在動畫開始前,你只要將動畫加入了一個layer,layer便立即進(jìn)入動畫的初始狀態(tài)并等待動畫開始.你可以這樣設(shè)定測試代碼,將一個動畫加入一個layer的時候延遲5秒執(zhí)行.然后就會發(fā)現(xiàn)在動畫沒有開始的時候,只要動畫被加入了layer,layer便處于動畫初始狀態(tài)
kCAFillModeBoth 理解了上面兩個,這個就很好理解了,這個其實就是上面兩個的合成.動畫加入后開始之前,layer便處于動畫初始狀態(tài),動畫結(jié)束后layer保持動畫最后的狀態(tài).
全局時間和本地時間
CoreAnimation有一個全局時間的概念,即馬赫時間
-
CACurrentMediaTime訪問馬赫時間。它返回了設(shè)備自上次啟動后的秒數(shù) - 每個CALayer和CAAnimation實例都有自己本地時間的概念,是根據(jù)beginTime、timeOffset和speed屬性計算,類似于相對坐標(biāo)轉(zhuǎn)換,CALayer也提供了方法轉(zhuǎn)換不同圖層的本地時間:
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(nullable CALayer *)l;
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(nullable CALayer *)l;
暫停,倒回和快進(jìn)
- 設(shè)置圖層的speed為0,暫停
- 負(fù)數(shù) , 倒回
- 大于1,快進(jìn)
想要加速所有視圖動畫self.window.layer.speed = 100;
手動控制動畫
設(shè)置圖層的speed為0,可以禁用動畫的自動播放
使用timeOffset調(diào)整動畫開始在整個動畫過程中的時間點
對于一個復(fù)雜的動畫,或者有多個圖層的動畫組,相對于實時計算圖層的屬性而言,這種方法會更加簡單