CoreAnimation

概念篇:

?. CoreAnimation翻譯過(guò)來(lái)就是核心動(dòng)畫(huà),聽(tīng)起來(lái)很高大上,其實(shí)它就是一組API而已,一組很強(qiáng)大的動(dòng)畫(huà)處理API,它會(huì)讓你的應(yīng)用使用很少的代碼構(gòu)建出很絢麗的效果。

.Core Animation的動(dòng)畫(huà)執(zhí)行都是在后臺(tái)(子線(xiàn)程),不會(huì)阻塞到主線(xiàn)程的

.Core Animation是直接作用在CaLayer上的,并不是UIView上

使用步驟:

1.首先把QuaratzCore.framework添加進(jìn)來(lái)并 應(yīng)用頭文件<QuartzCore/QuartzCore.h>

2.初始化一個(gè)CAAnimation 對(duì)象,并設(shè)置屬性(其實(shí)我們一般使用CAAnimation的子類(lèi))后面會(huì)說(shuō)為什么,從屬性中可以確定我們的動(dòng)畫(huà)是怎樣的

3.這是最很重要的一步,上面說(shuō)過(guò)CoreAnimation是作用在CALayer上的,調(diào)用CALayer的addAnimation:forKey:方法把動(dòng)畫(huà)添加到CALyaer上這樣就能執(zhí)行動(dòng)畫(huà)了

4.移除動(dòng)畫(huà),調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動(dòng)畫(huà)

CAAnimation繼承關(guān)系

經(jīng)常用CoreAnimarion的朋友應(yīng)該知道我們平時(shí)基本不會(huì)直接使用CAAnimation初始化一個(gè)動(dòng)畫(huà)對(duì)象,一般情況下我們都是用其子類(lèi),下面我們看看他的繼承結(jié)構(gòu)


黑線(xiàn)代表繼承,黑色文字代表類(lèi)名,白色文字代表屬性。其中CAMediaTiming是一個(gè)協(xié)議(protocol)。

* CAAnimation是所有動(dòng)畫(huà)類(lèi)的父類(lèi),但是它不能直接使用,應(yīng)該使用它的子類(lèi)

* 常見(jiàn)屬性有:

1>duration:動(dòng)畫(huà)的持續(xù)時(shí)間

2>repeatCount:動(dòng)畫(huà)的重復(fù)次數(shù),loadingAnimation.repeatCount = LONG_MAX(基本可以代表無(wú)限循環(huán)了)

3>timingFunction:控制動(dòng)畫(huà)運(yùn)行的節(jié)奏

timingFunction可選的值有:

kCAMediaTimingFunctionLinear(線(xiàn)性):勻速,給你一個(gè)相對(duì)靜態(tài)的感覺(jué)

kCAMediaTimingFunctionEaseIn(漸進(jìn)):動(dòng)畫(huà)緩慢進(jìn)入,然后加速離開(kāi)

kCAMediaTimingFunctionEaseOut(漸出):動(dòng)畫(huà)全速進(jìn)入,然后減速的到達(dá)目的地

kCAMediaTimingFunctionEaseInEaseOut(漸進(jìn)漸出):動(dòng)畫(huà)緩慢的進(jìn)入,中間加速,然后減速的到達(dá)目的地。這個(gè)是默認(rèn)的動(dòng)畫(huà)行為。

4>delegate:動(dòng)畫(huà)代理

動(dòng)畫(huà)開(kāi)始的時(shí)候調(diào)用

- (void)animationDidStart:(CAAnimation *)anim;

動(dòng)畫(huà)停止的時(shí)候調(diào)用

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;

下面介紹幾個(gè)我們常用的動(dòng)畫(huà)類(lèi)

CABasicAnimation:基本動(dòng)畫(huà)類(lèi),繼承CAPropertyAnimation屬性動(dòng)畫(huà)

來(lái)一波代碼感受一下

CABasicAnimation *loadingAnimation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; //核心部分了,定義某個(gè)屬性

loadingAnimation.duration = 0.8; ?//動(dòng)畫(huà)持續(xù)時(shí)間

loadingAnimation.repeatCount = LONG_MAX; ?//重復(fù)次數(shù)

loadingAnimation.fromValue = @(0); //開(kāi)始值

loadingAnimation.toValue = @(2*M_PI); //結(jié)束值

動(dòng)畫(huà)過(guò)程說(shuō)明:

隨著動(dòng)畫(huà)的進(jìn)行,在長(zhǎng)度為duration的持續(xù)時(shí)間內(nèi),keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue

keyPath內(nèi)容是CALayer的可動(dòng)畫(huà)Animatable屬性

如果fillMode=kCAFillModeForwards同時(shí)removedOnComletion=NO,那么在動(dòng)畫(huà)執(zhí)行完畢后,圖層會(huì)保持顯示動(dòng)畫(huà)執(zhí)行后的狀態(tài)。但在實(shí)質(zhì)上,圖層的屬性值還是動(dòng)畫(huà)執(zhí)行前的初始值,并沒(méi)有真正被改變。可以通過(guò)打印看看其位置信息


CAKeyframeAnimation 關(guān)鍵幀動(dòng)畫(huà),繼承CAPropertyAnimation屬性動(dòng)畫(huà)

屬性說(shuō)明:

values:上述的NSArray對(duì)象。里面的元素稱(chēng)為“關(guān)鍵幀”(keyframe)。動(dòng)畫(huà)對(duì)象會(huì)在指定的時(shí)間(duration)內(nèi),依次顯示values數(shù)組中的每一個(gè)關(guān)鍵幀

path:可以設(shè)置一個(gè)CGPathRef、CGMutablePathRef,讓圖層按照路徑軌跡移動(dòng)。path只對(duì)CALayer的anchorPoint和position起作用。如果設(shè)置了path,那么values將被忽略

keyTimes:可以為對(duì)應(yīng)的關(guān)鍵幀指定對(duì)應(yīng)的時(shí)間點(diǎn),其取值范圍為0到1.0,keyTimes中的每一個(gè)時(shí)間值都對(duì)應(yīng)values中的每一幀。如果沒(méi)有設(shè)置keyTimes,各個(gè)關(guān)鍵幀的時(shí)間是平分的

CABasicAnimation可看做是只有2個(gè)關(guān)鍵幀的CAKeyframeAnimation

下一篇將會(huì)記錄“貝塞爾曲線(xiàn)與CAShapeLayer”的神奇功效

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容