iOS中CoreAnimation開發(fā)框架中Layer層動畫相關(guān)

? ? ?Copyright ? 2017年ZaneWangWang. All rights reserved.

CAAnimation動畫體系的介紹

如果你看到的不是原文請看原文CoreAnimation開發(fā)框架中Layer層動畫,想看應(yīng)用實例請看我的另一篇文章iOS中Layer層CABasicAnimation和CAAnimationGroup應(yīng)用丁侄。

? ? ? ?CAAnimation是CoreAnimation框架中執(zhí)行動畫對象的基類,從CAAnimation中集成出三個子類分別是用于創(chuàng)建屬性動畫的CAPropertyAnimation北发,創(chuàng)建轉(zhuǎn)場動畫的CATransition和創(chuàng)建組合動畫的CAAnimationGroup。

Layer層動畫類繼承關(guān)系

1.CAAnimation屬性和方法

a.CAAnimation作為動畫對象的基類泵殴,其中封裝了動畫的基礎(chǔ)屬性,如下:

?+ (instancetype)animation;//通過類方法創(chuàng)建一個CAAnimation對象

@property(nullable, strong) CAMediaTimingFunction *timingFunction;//動畫執(zhí)行的時序模式

@property(nullable, strong) id delegate;//代理

@property(getter=isRemovedOnCompletion) BOOL removedOnCompletion;//是否動畫完成時將動畫對象移除掉

b.timingFunction定義了動畫執(zhí)行的時序效果萤彩,CAMediaTimingFunction的創(chuàng)建方式如下:

+ (instancetype)functionWithName:(NSString *)name;

name參數(shù)決定的執(zhí)行的效果村视,可選參數(shù)如下

NSString * const kCAMediaTimingFunctionLinear;//線性執(zhí)行

NSString * const kCAMediaTimingFunctionEaseIn;//淡入? 在動畫開始時 淡入效果

NSString * const kCAMediaTimingFunctionEaseOut;//淡出 在動畫結(jié)束時 淡出效果

NSString * const kCAMediaTimingFunctionEaseInEaseOut;//淡入淡出

NSString * const kCAMediaTimingFunctionDefault;//默認(rèn)效果

c.CAAnimation的代理方法入如下幾個:

- (void)animationDidStart:(CAAnimation *)anim;//動畫開始時執(zhí)行的回調(diào)

- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;//動畫結(jié)束后執(zhí)行的回調(diào)

2.CAPropertyAnimation屬性與方法

a.CAPropertyAnimation是繼承于CAAnimation專門用來創(chuàng)建與屬性相關(guān)的動畫的類:

+ (instancetype)animationWithKeyPath:(nullable NSString *)path;//創(chuàng)建對象 參數(shù)path就是執(zhí)行動畫的屬性的字符串

例如:要修改透明度path就傳@"alpha";

@property(getter=isAdditive) BOOL additive;//動畫執(zhí)行狀態(tài)是否疊加在控件原狀態(tài)上,默認(rèn)為NO

@property(getter=isCumulative) BOOL cumulative;//對于重復(fù)動畫來說,默認(rèn)為NO從起始狀態(tài)開始,YES表示在上一次執(zhí)行基礎(chǔ)之上執(zhí)行

@property(nullable, strong) CAValueFunction *valueFunction;//和transfron屬性的動畫執(zhí)行相關(guān),通過這個參數(shù),可以幫助我們直接操作transfrom3D屬性變化產(chǎn)生動畫效果

例如:做一個z軸的旋轉(zhuǎn)動畫

CABasicAnimation * animation = [CABasicAnimation animationWithKeyPath:@"transform"];

animation.fromValue = @0;//從0度開始

animation.toValue = [NSNumber numberWithFloat:M_PI];//旋轉(zhuǎn)到180度

animation.duration = 2;//時間2S

animation.valueFunction = [CAValueFunction functionWithName:kCAValueFunctionRotateZ];//設(shè)置為z軸旋轉(zhuǎn),實際上我們也可以不設(shè)置這個屬性,只需要在創(chuàng)建動畫對象的時候的path變?yōu)锧"transform.rotation.z"也可以訪問到這個屬性

[layer addAnimation:animation forKey:@""];//執(zhí)行動畫

3.CABasicAnimation屬性

CABasicAnimaton是CAPropertyAnimation分出來的一個子類盛正,創(chuàng)建基礎(chǔ)的屬性變化動畫删咱,例如我們上面的示例代碼,其中屬性如下:

@property(nullable, strong) id fromValue;//對應(yīng)屬性動畫開始值

@property(nullable, strong) id toValue;//對應(yīng)屬性動畫結(jié)束值

@property(nullable, strong) id byValue;///和fromeValue配合對應(yīng)屬性動畫開始值到fromValue+byValue,和toValue配合從toValue-byValue到toValue

具體確定動畫方案如下:

(1)fromValue和toValue不為空:動畫的值由fromValue變化到toValue

(2)fromValue和byValue不為空:動畫的值由fromValue變化到fromValue+byValue

(3)byValue和toValue不為空:動畫的值由toValue-byValue變化到toValue

(4)只有fromValue不為空:動畫的值由fromValue變化到layer的當(dāng)前狀態(tài)值

(5)只有toValue不為空:動畫的值由layer當(dāng)前的值變化到toValue

(6)只有byValue不為空:動畫的值由layer當(dāng)前的值變化到layer當(dāng)前的值+byValue

4.CAKeyframeAnimation關(guān)鍵幀動畫

CAKeyframeAnimation也是繼承與CAPropertyAnimation的一個子類豪筝,其與CABasicAnimation的不同之處在于雖然其都是改變layer層屬性的動畫痰滋,但是CABasicAnimation只能設(shè)置初始與結(jié)束狀態(tài),這之間我們沒辦法控制续崖,而CAKeyframeAnimation可以讓我們設(shè)置一些關(guān)鍵幀再整個動畫的過程中敲街。屬性方法如下:

@property(nullable, copy) NSArray *values;//關(guān)鍵幀的值數(shù)組 例如我們想讓控件沿某個路徑移動,這里面存放每個移動的點

例如:

CAKeyframeAnimation * ani = [CAKeyframeAnimation animationWithKeyPath:@"position"];

ani.values = @[[NSValue valueWithCGPoint:CGPointMake(100, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 100)],[NSValue valueWithCGPoint:CGPointMake(120, 200)],[NSValue valueWithCGPoint:CGPointMake(200, 200)]];

ani.duration = 3;

[layer addAnimation:ani forKey:@""];

@property(nullable) CGPathRef path;//直接設(shè)置路徑严望,作用域values類似

@property(nullable, copy) NSArray *keyTimes;//設(shè)置每一幀執(zhí)行的時間長短 這個的取值為0-1多艇,代表占用時間的比例

@property(nullable, copy) NSArray *timingFunctions;//每一幀的時序效果,詳見CAAnimation介紹b條

@property(copy) NSString *calculationMode;//設(shè)置幀的中間值如何計算

有以下幾種:

NSString * const kCAAnimationLinear;

NSString * const kCAAnimationDiscrete;

NSString * const kCAAnimationPaced;

NSString * const kCAAnimationCubic;

NSString * const kCAAnimationCubicPaced;

5.CATransition轉(zhuǎn)場動畫

CATransition和CAPropertyAnimation的不同之處在于當(dāng)layer層出現(xiàn)時,會產(chǎn)生動畫效果像吻,而并不是屬性改變時峻黍,屬性如下:

@property(copy) NSString *type;//設(shè)置動畫類型

動畫類型有:

NSString * const kCATransitionFade;//淡入

NSString * const kCATransitionMoveIn;//移入

NSString * const kCATransitionPush;//壓入

NSString * const kCATransitionReveal;//溶解

@property(nullable, copy) NSString *subtype;//設(shè)置動畫的方向

動畫方向有:

NSString * const kCATransitionFromRight;//從右側(cè)進(jìn)

NSString * const kCATransitionFromLeft;//從左側(cè)進(jìn)

NSString * const kCATransitionFromTop;//從上側(cè)進(jìn)

NSString * const kCATransitionFromBottom;//從下側(cè)進(jìn)

其實复隆,關(guān)于type定義的動畫效果,出來官方定義的姆涩,我們還可以使用一些私有的參數(shù)挽拂,如下:

(1)pageCurl?? 翻頁

(2)rippleEffect 滴水效果

(3)suckEffect 收縮效果,如一塊布被抽走

(4)cube 立方體效果

(5)oglFlip 上下翻轉(zhuǎn)效果

例如:

CATransition * ani = [CATransition animation];

ani.type =? @"pageCurl";

ani.subtype = kCATransitionFromRight;

[layer addAnimation:ani forKey:@""];

6.CAAnimationGroup動畫組

CAAnimationGroup本身并沒有定義動畫骨饿,他可以將我們上面提到的相關(guān)動畫進(jìn)行組合:

@property(nullable, copy) NSArray *animations;//動畫組

高級動畫技巧

1.事務(wù)類

CoreAnimation中還有一個非常重要的類:CATransaction事物類亏栈,這個可以同時設(shè)置多個layer層的動畫效果『曜福可以通過隱式和顯式兩種方式來進(jìn)行動畫操作绒北。

2.CATransaction屬性

對layer層的屬性操作,都會形成隱式動畫察署,要使用隱式動畫镇饮,需要關(guān)閉layer層的animation動畫屬性,使用下面的方法:

+ (BOOL)disableActions;//關(guān)閉animation動畫效果箕母,開啟隱式動畫

+ (void)setDisableActions:(BOOL)flag;

CATransaction用類方式通過設(shè)置key-value來進(jìn)行動畫的屬性設(shè)置:

+ (nullable id)valueForKey:(NSString *)key;

+ (void)setValue:(nullable id)anObject forKey:(NSString *)key;

支持的key值如下:


NSString * const kCATransactionAnimationDuration;//設(shè)置動畫持續(xù)時間

NSString * const kCATransactionDisableActions;//設(shè)置停用animation類動畫

NSString * const kCATransactionAnimationTimingFunction;//設(shè)置動畫時序效果

NSString * const kCATransactionCompletionBlock;//設(shè)置動畫完成后的回調(diào)

除了隱式的展示動畫外储藐,也可以顯式的通過調(diào)用CATransaction的相關(guān)方法進(jìn)行顯示的提交動畫:

+ (void)begin;//動畫開始

+ (void)commit;//提交動畫

+ (void)flush;//立即進(jìn)行動畫渲染 一般不需調(diào)用

下面這兩個方法用于動畫事物的加鎖與解鎖 在多線程動畫中,保證修改屬性的安全

+ (void)lock;

+ (void)unlock;

本文借鑒腳本之家大神博文

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嘶是,一起剝皮案震驚了整個濱河市钙勃,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌聂喇,老刑警劉巖辖源,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異希太,居然都是意外死亡克饶,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門誊辉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矾湃,“玉大人,你說我怎么就攤上這事堕澄⊙荆” “怎么了?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵蛙紫,是天一觀的道長拍屑。 經(jīng)常有香客問我,道長坑傅,這世上最難降的妖魔是什么僵驰? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上蒜茴,老公的妹妹穿的比我還像新娘星爪。我一直安慰自己,他們只是感情好矮男,可當(dāng)我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著室谚,像睡著了一般毡鉴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上秒赤,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天猪瞬,我揣著相機與錄音,去河邊找鬼入篮。 笑死陈瘦,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的潮售。 我是一名探鬼主播痊项,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼酥诽!你這毒婦竟也來了鞍泉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤肮帐,失蹤者是張志新(化名)和其女友劉穎咖驮,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體训枢,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡托修,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了睦刃。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡十酣,死狀恐怖眯勾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情婆誓,我是刑警寧澤吃环,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站洋幻,受9級特大地震影響郁轻,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一好唯、第九天 我趴在偏房一處隱蔽的房頂上張望竭沫。 院中可真熱鬧,春花似錦骑篙、人聲如沸蜕提。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谎势。三九已至,卻和暖如春杨名,著一層夾襖步出監(jiān)牢的瞬間脏榆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工台谍, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留须喂,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓趁蕊,卻偏偏與公主長得像坞生,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掷伙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,514評論 2 348

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