Core Animation,中文翻譯為核心動畫,它是一組非常強大的動畫處理API,使用它能做出非常絢麗的動畫效果,而且往往事半功倍.也就是說,使用少量的代碼就可以實現(xiàn)非常強大的功能.
- Core Animation的動畫執(zhí)行過程都是在后臺操作的,不會阻塞主線程
- Core Animation是直接作用在CALayer上的,并非UIView
所以在了解Core Animation之前,先要了解什么是CALayer
CALayer
在iOS中,你能看得見摸得著的東西基本上都是UIView,比如:按鈕,文本標簽等等;其實UIView之所以能顯示在屏幕上,完全是因為它內(nèi)部的一個圖層
- 在創(chuàng)建UIView對象時,UIView內(nèi)部會自動創(chuàng)建一個圖層(即CALayer對象),通過UIView的layer屬性可以訪問這個層
@property(nonatomic,readonly,retain) CALayer *layer;
- 當UIView需要顯示到屏幕上時么介,會調(diào)用drawRect:方法進行繪圖丁鹉,并且會將所有內(nèi)容繪制在自己的圖層上悯恍,繪圖完畢后宙枷,系統(tǒng)會將圖層拷貝到屏幕上,于是就完成了UIView的顯示;UIView本身不具備顯示的功能衩匣,是它內(nèi)部的層才有顯示功能
- CALayer的一些屬性
//寬度和高度
@property CGRect bounds;
//位置(默認指中點擂仍,具體由anchorPoint決定)
@property CGPoint position;
//錨點(x,y的范圍都是0-1),決定了position的含義
@property CGPoint anchorPoint;
//背景顏色(CGColorRef類型)
@property CGColorRef backgroundColor;
//形變屬性
@property CATransform3D transform;
//邊框顏色(CGColorRef類型)
@property CGColorRef borderColor;
//邊框?qū)挾?@property CGFloat borderWidth;
//圓角半徑
@property CGColorRef borderColor;
//內(nèi)容(比如設(shè)置為圖片CGImageRef)
@property(retain) id contents;
UIView和CALayer的選擇
通過CALayer笑跛,就能做出跟UIImageView一樣的界面效果
既然CALayer和UIView都能實現(xiàn)相同的顯示效果付魔,那究竟該選擇誰好呢聊品?
其實,對比CALayer几苍,UIView多了一個事件處理的功能翻屈。也就是說,CALayer不能處理用戶的觸摸事件妻坝,而UIView可以.
所以伸眶,如果顯示出來的東西需要跟用戶進行交互的話,用UIView刽宪;如果不需要跟用戶進行交互赚抡,用UIView或者CALayer都可以.
當然,CALayer的性能會高一些纠屋,因為它少了事件處理的功能涂臣,更加輕量級.
position和anchorPoint
@property CGPoint position;
- 用來設(shè)置CALayer在父層中的位置
- 以父層的左上角為原點(0, 0)
@property CGPoint anchorPoint;
- 稱為“定位點”、“錨點”
- 決定著CALayer身上的哪個點會在position屬性所指的位置
- 以自己的左上角為原點(0, 0)
- 它的x售担、y取值范圍都是0~1赁遗,默認值為(0.5, 0.5)
隱式動畫
- 每一個UIView內(nèi)部都默認關(guān)聯(lián)著一個CALayer,我們可用稱這個Layer為Root Layer(根層)
- 所有的非Root Layer族铆,也就是手動創(chuàng)建的CALayer對象岩四,都存在著隱式動畫
- 什么是隱式動畫?
- 當對非Root Layer的部分屬性進行修改時哥攘,默認會自動產(chǎn)生一些動畫效果
- 而這些屬性稱為Animatable Properties(可動畫屬性)
- 列舉幾個常見的Animatable Properties:
- bounds:用于設(shè)置CALayer的寬度和高度剖煌。修改這個屬性會產(chǎn)生縮放動畫
- backgroundColor:用于設(shè)置CALayer的背景色。修改這個屬性會產(chǎn)生背景色的漸變動畫
- position:用于設(shè)置CALayer的位置逝淹。修改這個屬性會產(chǎn)生平移動畫
- 可以通過動畫事務(CATransaction)關(guān)閉默認的隱式動畫效果
[CATransaction begin];
[CATransaction setDisableActions:YES];
self.myview.layer.position = CGPointMake(10, 10);
[CATransaction commit];
Core Animation
- 核心動畫中所有類都遵守CAMediaTiming
- CAAnaimation是個抽象類耕姊,不具備動畫效果,必須用它的子類才有動畫效果
- CAAnimationGroup和CATransition才有動畫效果
- CAAnimationGroup是個動畫組栅葡,可以同時進行縮放茉兰,旋轉(zhuǎn)。
- CATransition是轉(zhuǎn)場動畫欣簇,界面之間跳轉(zhuǎn)都可以用轉(zhuǎn)場動畫规脸。
- CAPropertyAnimation也是個抽象類,本身不具備動畫效果熊咽,只有子類才有
- CABasicAnimation和CAKeyframeAnimation
- CABasicAnimation基本動畫莫鸭,做一些簡單效果
- CAKeyframeAnimation幀動畫,做一些連續(xù)的流暢的動畫
- CABasicAnimation和CAKeyframeAnimation
開發(fā)步驟
如果不是xcode5之后的版本横殴,使用它需要先添QuartzCore.framework和引入對應的框架<QuartzCore/QuartzCore.h>
- 首先得有CALayer
- 初始化一個CAAnimation對象被因,并設(shè)置一些動畫相關(guān)屬性
- 通過調(diào)用CALayer的addAnimation:forKey:方法,增加CAAnimation對象到CALayer中,這樣就能開始執(zhí)行動畫了
- 通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫
CAAnimation
簡介
- 是所有動畫對象的父類氏身,負責控制動畫的持續(xù)時間和速度巍棱,是個抽象類,不能直接使用蛋欣,應該使用它具體的子類
- 屬性說明:(紅色代表來自CAMediaTiming協(xié)議的屬性)
- duration:動畫的持續(xù)時間
- repeatCount:重復次數(shù)航徙,無限循環(huán)可以設(shè)置HUGE_VALF或者MAXFLOAT
- repeatDuration:重復時間
- removedOnCompletion:默認為YES,代表動畫執(zhí)行完畢后就從圖層上移除陷虎,圖形會恢復到動畫執(zhí)行前的狀態(tài)到踏。如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài),那就設(shè)置為NO尚猿,不過還要設(shè)置fillMode為kCAFillModeForwards
- fillMode:決定當前對象在非active時間段的行為窝稿。比如動畫開始之前或者動畫結(jié)束之后
- beginTime:可以用來設(shè)置動畫延遲執(zhí)行時間,若想延遲2s凿掂,就設(shè)置為CACurrentMediaTime()+2伴榔,CACurrentMediaTime()為圖層的當前時間
- timingFunction:速度控制函數(shù),控制動畫運行的節(jié)奏
- delegate:動畫代理
#pragma mark 暫停CALayer的動畫
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 讓CALayer的時間停止走動
layer.speed = 0.0;
// 讓CALayer的時間停留在pausedTime這個時刻
layer.timeOffset = pausedTime;
}
#pragma mark 恢復CALayer的動畫
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = layer.timeOffset;
// 1. 讓CALayer的時間繼續(xù)行走
layer.speed = 1.0;
// 2. 取消上次記錄的停留時刻
layer.timeOffset = 0.0;
// 3. 取消上次設(shè)置的時間
layer.beginTime = 0.0;
// 4. 計算暫停的時間(這里也可以用CACurrentMediaTime()-pausedTime)
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
// 5. 設(shè)置相對于父坐標系的開始時間(往后退timeSincePause)
layer.beginTime = timeSincePause;
}
動畫填充模式
- fillMode屬性值(要想fillMode有效庄萎,最好設(shè)置removedOnCompletion = NO)
- kCAFillModeRemoved 這個是默認值踪少,也就是說當動畫開始前和動畫結(jié)束后,動畫對layer都沒有影響糠涛,動畫結(jié)束后援奢,layer會恢復到之前的狀態(tài)
- kCAFillModeForwards 當動畫結(jié)束后,layer會一直保持著動畫最后的狀態(tài)
- kCAFillModeBackwards 在動畫開始前忍捡,只需要將動畫加入了一個layer集漾,layer便立即進入動畫的初始狀態(tài)并等待動畫開始。
- kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入后開始之前砸脊,layer便處于動畫初始狀態(tài)具篇,動畫結(jié)束后layer保持動畫最后的狀態(tài)
速度控制函數(shù)
- 速度控制函數(shù)(CAMediaTimingFunction)
- kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態(tài)的感覺
- kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入脓规,然后加速離開
- kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入栽连,然后減速的到達目的地
- kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入险领,中間加速侨舆,然后減速的到達目的地。這個是默認的動畫行為绢陌。
動畫代理方法
@interface NSObject (CAAnimationDelegate)
/* Called when the animation begins its active duration. */
- (void)animationDidStart:(CAAnimation *)anim;
/* Called when the animation either completes its active duration or
* is removed from the object it is attached to (i.e. the layer). 'flag'
* is true if the animation reached the end of its active duration
* without being removed. */
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
1. CAPropertyAnimation
-
是CAAnimation的子類挨下,也是個抽象類,要想創(chuàng)建動畫對象脐湾,應該使用它的兩個子類:
- CABasicAnimation
- CAKeyframeAnimation
-
屬性說明:
- keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型)臭笆,并且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。比如愁铺,指定@“position”為keyPath鹰霍,就修改CALayer的position屬性的值,以達到平移的動畫效果
CABasicAnimation
基本動畫,是CAPropertyAnimation的子類
-
屬性說明:
- fromValue:keyPath相應屬性的初始值
- toValue:keyPath相應屬性的結(jié)束值
-
動畫過程說明:
- 隨著動畫的進行茵乱,在長度為duration的持續(xù)時間內(nèi)茂洒,keyPath相應屬性的值從fromValue漸漸地變?yōu)閠oValue
- keyPath內(nèi)容是CALayer的可動畫Animatable屬性
- 如果fillMode=kCAFillModeForwards同時removedOnComletion=NO,那么在動畫執(zhí)行完畢后瓶竭,圖層會保持顯示動畫執(zhí)行后的狀態(tài)督勺。但在實質(zhì)上,圖層的屬性值還是動畫執(zhí)行前的初始值斤贰,并沒有真正被改變智哀。
關(guān)鍵幀動畫
-
關(guān)鍵幀動畫,也是CAPropertyAnimation的子類荧恍,與CABasicAnimation的區(qū)別是:
- CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)瓷叫,而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值
-
屬性說明:
- values:上述的NSArray對象。里面的元素稱為“關(guān)鍵幀”(keyframe)送巡。動畫對象會在指定的時間(duration)內(nèi)赞辩,依次顯示values數(shù)組中的每一個關(guān)鍵幀
- path:可以設(shè)置一個CGPathRef、CGMutablePathRef授艰,讓圖層按照路徑軌跡移動辨嗽。path只對CALayer的anchorPoint和position起作用。如果設(shè)置了path淮腾,那么values將被忽略
- keyTimes:可以為對應的關(guān)鍵幀指定對應的時間點糟需,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應values中的每一幀谷朝。如果沒有設(shè)置keyTimes洲押,各個關(guān)鍵幀的時間是平分的
CABasicAnimation可看做是只有2個關(guān)鍵幀的CAKeyframeAnimation
2. CAAnimationGroup
動畫組,是CAAnimation的子類圆凰,可以保存一組動畫對象杈帐,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時并發(fā)運行
-
屬性說明:
- animations:用來保存一組動畫對象的NSArray
- 默認情況下专钉,一組動畫對象是同時運行的挑童,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時間
3. CATransition
- CATransition是CAAnimation的子類,用于做轉(zhuǎn)場動畫跃须,能夠為層提供移出屏幕和移入屏幕的動畫效果站叼。iOS比Mac OS X的轉(zhuǎn)場動畫效果少一點
- UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果
- 動畫屬性:
- type:動畫過渡類型
- subtype:動畫過渡方向
- startProgress:動畫起點(在整體動畫的百分比)
- endProgress:動畫終點(在整體動畫的百分比)
- 轉(zhuǎn)場動畫過渡效果
類型字符串 | 效果說明 | 關(guān)鍵字 | 方向 |
---|---|---|---|
fade | 交叉淡化過渡 | YES | |
push | 新視圖把舊視圖推出去 | YES | |
moveIn | 新視圖移到舊視圖上面 | YES | |
reveal | 將舊視圖移開,顯示下面的新視圖 | YES | |
cube | 立方體翻滾效果 | ||
oglFlip | 上下左右翻轉(zhuǎn)效果 | ||
suckEffect | 收縮效果,如一塊布被抽走 | NO | |
rippleEffect | 水滴效果 | NO | |
pageCurl | 向上翻頁效果 | ||
pageUnCurl | 向下翻頁效果 | ||
facameraIrisHollowOpende | 相機鏡頭打開效果 | NO | |
cameraIrisHollowClose | 相機鏡頭關(guān)閉效果 | NO |
使用UIView動畫函數(shù)實現(xiàn)轉(zhuǎn)場動畫——單視圖
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
- 參數(shù)說明:
- duration:動畫的持續(xù)時間
- view:需要進行轉(zhuǎn)場動畫的視圖
- options:轉(zhuǎn)場動畫的類型
- animations:將改變視圖屬性的代碼放在這個block中
- completion:動畫結(jié)束后菇民,會自動調(diào)用這個block
使用UIView動畫函數(shù)實現(xiàn)轉(zhuǎn)場動畫——雙視圖
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
- 參數(shù)說明:
- duration:動畫的持續(xù)時間
- options:轉(zhuǎn)場動畫的類型
- animations:將改變視圖屬性的代碼放在這個block中
- completion:動畫結(jié)束后尽楔,會自動調(diào)用這個block