概念篇:
?. 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)
* 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”的神奇功效