? ? ?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。
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;
本文借鑒腳本之家大神博文