圖層時(shí)間
CAMediaTiming協(xié)議
-
CAMediaTiming協(xié)議定義了在一段動(dòng)畫內(nèi)用來(lái)控制逝去時(shí)間的屬性的集合,CALayer和CAAnimation都實(shí)現(xiàn)了這個(gè)協(xié)議。 -
持續(xù)和重復(fù)
duration和repeatCount默認(rèn)都是0。但這不意味著動(dòng)畫時(shí)長(zhǎng)為0秒,或者0次,這里的0僅僅代表了“默認(rèn)”,也就是0.25秒和1次。
創(chuàng)建重復(fù)動(dòng)畫的另一種方式是使用repeatDuration屬性,它讓動(dòng)畫重復(fù)一個(gè)指定的時(shí)間,而不是指定次數(shù)。還可以設(shè)置一個(gè)叫做autoreverses的屬性(BOOL類型),可以在動(dòng)畫結(jié)束后執(zhí)行逆動(dòng)畫。
-
相對(duì)時(shí)間
beginTime指定了動(dòng)畫開始之前的的延遲時(shí)間。這里的延遲從動(dòng)畫添加到可見(jiàn)圖層的那一刻開始測(cè)量,默認(rèn)是0(就是說(shuō)動(dòng)畫會(huì)立刻執(zhí)行)。
speed是一個(gè)時(shí)間的倍數(shù),默認(rèn)1.0,減少它會(huì)減慢圖層/動(dòng)畫的時(shí)間,增加它會(huì)加快速度。如果2.0的速度,那么對(duì)于一個(gè)duration為1的動(dòng)畫,實(shí)際上在0.5秒的時(shí)候就已經(jīng)完成了。
timeOffset和beginTime類似,但是和增加beginTime導(dǎo)致的延遲動(dòng)畫不同,增加timeOffset只是讓動(dòng)畫快進(jìn)到某一點(diǎn),例如,對(duì)于一個(gè)持續(xù)1秒的動(dòng)畫來(lái)說(shuō),設(shè)置timeOffset為0.5意味著動(dòng)畫將從一半的地方開始。
-
fillMode
設(shè)置fillMode時(shí)需要把removeOnCompletion設(shè)置為NO。
層級(jí)關(guān)系時(shí)間
- 對(duì)
CALayer或者CAGroupAnimation調(diào)整duration和repeatCount/repeatDuration屬性并不會(huì)影響到子動(dòng)畫。但是beginTime,timeOffset和speed屬性將會(huì)影響到子動(dòng)畫。 -
全局時(shí)間和本地時(shí)間
- CoreAnimation有一個(gè)全局時(shí)間的概念,也就是所謂的馬赫時(shí)間。馬赫時(shí)間在設(shè)備上所有進(jìn)程都是全局的,但是在不同設(shè)備上并不是全局的??梢允褂?code>CACurrentMediaTime函數(shù)來(lái)訪問(wèn)馬赫時(shí)間:
CFTimeInterval time = CACurrentMediaTime()
這個(gè)函數(shù)返回的值其實(shí)無(wú)關(guān)緊要(它返回了設(shè)備自從上次啟動(dòng)后的秒數(shù),并不是你所關(guān)心的),它真實(shí)的作用在于對(duì)動(dòng)畫的時(shí)間測(cè)量提供了一個(gè)相對(duì)值。 - 每個(gè)
CALayer和CAAnimation實(shí)例都有自己本地時(shí)間的概念,是根據(jù)父圖層/動(dòng)畫層級(jí)關(guān)系中的beginTime,timeOffset和speed屬性計(jì)算。就和轉(zhuǎn)換不同圖層之間坐標(biāo)關(guān)系一樣,CALayer同樣也提供了方法來(lái)轉(zhuǎn)換不同圖層之間的本地時(shí)間。如下:
- (CFTimeInterval)convertTime:(CFTimeInterval)t fromLayer:(CALayer *)l
- (CFTimeInterval)convertTime:(CFTimeInterval)t toLayer:(CALayer *)l
手動(dòng)動(dòng)畫
-
timeOffset一個(gè)很有用的功能在于你可以它可以讓你手動(dòng)控制動(dòng)畫進(jìn)程,通過(guò)設(shè)置speed為0,可以禁用動(dòng)畫的自動(dòng)播放,然后來(lái)使用timeOffset來(lái)來(lái)回顯示動(dòng)畫序列。這可以使得運(yùn)用手勢(shì)來(lái)手動(dòng)控制動(dòng)畫變得很簡(jiǎn)單。
緩沖
動(dòng)畫速度
- 改變動(dòng)畫速度首先需要設(shè)置
CAAnimation的timingFunction屬性,是CAMediaTimingFunction類的一個(gè)對(duì)象。如果想改變隱式動(dòng)畫的計(jì)時(shí)函數(shù),同樣也可以使用CATransaction的+setAnimationTimingFunction:方法。有一些方式來(lái)創(chuàng)建CAMediaTimingFunction,最簡(jiǎn)單的方式是調(diào)用+timingFunctionWithName:的構(gòu)造方法。這里傳入如下幾個(gè)常量之一:
kCAMediaTimingFunctionLinear
kCAMediaTimingFunctionEaseIn
kCAMediaTimingFunctionEaseOut
kCAMediaTimingFunctionEaseInEaseOut
kCAMediaTimingFunctionDefault
kCAMediaTimingFunctionLinear創(chuàng)建了一個(gè)線性的計(jì)時(shí)函數(shù),同樣也是CAAnimation的timingFunction屬性為空時(shí)候的默認(rèn)函數(shù)。
kCAMediaTimingFunctionEaseIn常量創(chuàng)建了一個(gè)慢慢加速然后突然停止的方法。
kCAMediaTimingFunctionEaseOut則恰恰相反,它以一個(gè)全速開始,然后慢慢減速停止。
kCAMediaTimingFunctionEaseInEaseOut創(chuàng)建了一個(gè)慢慢加速然后再慢慢減速的過(guò)程。
最后還有一個(gè)kCAMediaTimingFunctionDefault,它和kCAMediaTimingFunctionEaseInEaseOut很類似,但是加速和減速的過(guò)程都稍微有些慢。雖然它的名字說(shuō)是默認(rèn)的,但還是要記住當(dāng)創(chuàng)建顯式的CAAnimation它并不是默認(rèn)選項(xiàng)(換句話說(shuō),默認(rèn)的圖層行為動(dòng)畫用kCAMediaTimingFunctionDefault作為它們的計(jì)時(shí)方法)。 -
緩沖和關(guān)鍵幀動(dòng)畫
CAKeyframeAnimation有一個(gè)NSArray類型的timingFunctions屬性,我們可以用它來(lái)對(duì)每次動(dòng)畫的步驟指定不同的計(jì)時(shí)函數(shù)。但是指定函數(shù)的個(gè)數(shù)一定要等于values數(shù)組的元素個(gè)數(shù)減一,因?yàn)樗敲枋雒恳粠g動(dòng)畫速度的函數(shù)。
let animation = CAKeyframeAnimation()
animation.keyPath = "backgroundColor"
animation.values = [UIColor.redColor().CGColor,UIColor.greenColor().CGColor,UIColor.blueColor().CGColor,UIColor.redColor().CGColor]
animation.duration = 4.0
let fn = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseIn)
animation.timingFunctions = [fn,fn,fn]
self.colorLayer.addAnimation(animation, forKey: nil)