Core Animation,即為核心動畫,它是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果,而且往往是事半功倍。也就是說,使用少量的代碼就可以實現非常強大的功能。Core Animation可以用在Mac OS X和iOS平台。Core Animation的動畫執行過程都是在后台操作的,不會阻塞主線程。要注意的是,Core Animation是直接作用在CALayer上的,並非UIView。
1. 使用步驟
- 使用它需要先添加QuartzCore.framework框架和引入主頭文件<QuartzCore/QuartzCore.h>(iOS7不需要);
- 初始化一個CAAnimation對象,並設置一些動畫相關屬性;
- 通過調用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中,這樣就能開始執行動畫了;
- 通過調用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫。
2. 結構
CAAnimation是所有動畫對象的父類,負責控制動畫的持續時間和速度,是個抽象類,不能直接使用,應該使用它具體的子類。屬性:
duration:動畫的持續時間
repeatCount:動畫的重復次數
repeatDuration:動畫的重復時間
removedOnCompletion:默認為YES,代表動畫執行完畢后就從圖層上移除,圖形會恢復到動畫執行前的狀態。如果想讓圖層保持顯示動畫執行后的狀態,那就設置為NO,不過還要設置fillMode為kCAFillModeForwards
fillMode:決定當前對象在非active時間段的行為。比如動畫開始之前,動畫結束之后
beginTime:可以用來設置動畫延遲執行時間,若想延遲2s,就設置為CACurrentMediaTime()+2,CACurrentMediaTime()為圖層的當前時間
timingFunction:速度控制函數,控制動畫運行的節奏
delegate:動畫代理
3. 子類
-
CAPropertyAnimation,是CAAnimation的子類,也是個抽象類,要想創建動畫對象,應該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation。
屬性解析:
- keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型),並且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。比如,指定@”position”為keyPath,就修改CALayer的position屬性的值,以達到平移的動畫效果。
-
CABasicAnimation
屬性解析:
- fromValue:keyPath相應屬性的初始值。
- toValue:keyPath相應屬性的結束值。
- 隨着動畫的進行,在長度為duration的持續時間內,keyPath相應屬性的值從fromValue漸漸地變為toValue。
- 如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在動畫執行完畢后,圖層會保持顯示動畫執行后的狀態。但在實質上,圖層的屬性值還是動畫執行前的初始值,並沒有真正被改變。比如,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10),toValue為(100,100),雖然動畫執行完畢后圖層保持在(100,100)這個位置,實質上圖層的position還是為(0,0)。
-
CAKeyframeAnimation,CApropertyAnimation的子類,跟CABasicAnimation的區別是:CABasicAnimation只能從一個數值(fromValue)變到另一個數值(toValue),而CAKeyframeAnimation會使用一個NSArray保存這些數值。
屬性解析:
- values:就是上述的NSArray對象。里面的元素稱為”關鍵幀”(keyframe)。動畫對象會在指定的時間(duration)內,依次顯示values數組中的每一個關鍵幀。
- path:可以設置一個CGPathRef\CGMutablePathRef,讓層跟着路徑移動。path只對CALayer的anchorPoint和position起作用。如果你設置了path,那么values將被忽略。
- keyTimes:可以為對應的關鍵幀指定對應的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應values中的每一幀.當keyTimes沒有設置的時候,各個關鍵幀的時間是平分的。
- CABasicAnimation可看做是最多只有2個關鍵幀的CAKeyframeAnimation。
-
CAAnimationGroup,CAAnimation的子類,可以保存一組動畫對象,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時並發運行。
屬性解析:
- animations:用來保存一組動畫對象的NSArray。
- 默認情況下,一組動畫對象是同時運行的,也可以通過設置動畫對象的beginTime屬性來更改動畫的開始時間。
-
CATransition,CAAnimation的子類,用於做轉場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉場動畫效果少一點。UINavigationController就是通過CATransition實現了將控制器的視圖推入屏幕的動畫效果。
屬性解析:
- type:動畫過渡類型。
- subtype:動畫過渡方向。
- startProgress:動畫起點(在整體動畫的百分比)。
- endProgress:動畫終點(在整體動畫的百分比)。
/* 過渡效果
fade //交叉淡化過渡(不支持過渡方向) kCATransitionFade
push //新視圖把舊視圖推出去 kCATransitionPush
-
moveIn //新視圖移到舊視圖上面 kCATransitionMoveIn
reveal //將舊視圖移開,顯示下面的新視圖 kCATransitionReveal
cube //立方體翻滾效果
oglFlip //上下左右翻轉效果
suckEffect //收縮效果,如一塊布被抽走(不支持過渡方向)
rippleEffect //滴水效果(不支持過渡方向)
pageCurl //向上翻頁效果
pageUnCurl //向下翻頁效果
cameraIrisHollowOpen //相機鏡頭打開效果(不支持過渡方向)
cameraIrisHollowClose //相機鏡頭關上效果(不支持過渡方向)
*/
/* 過渡方向
kCATransitionFromRight
kCATransitionFromLeft
kCATransitionFromBottom
kCATransitionFromTop
*/
// CATransition的使用
CATransition *anim = [CATransition animation];
anim.type = @
"cube"
;
// 動畫過渡類型
anim.subtype = kCATransitionFromTop;
// 動畫過渡方向
anim.duration = 1;
// 動畫持續1s
// 代理,動畫執行完畢后會調用delegate的animationDidStop:finished:
anim.delegate = self;
-
UIView動畫
UIKit直接將動畫集成到UIView類中,當內部的一些屬性發生改變時,UIView將為這些改變提供動畫支持.
執行動畫所需要的工作由UIView類自動完成,但仍要在希望執行動畫時通知視圖,為此需要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間
常見方法解析:
+ (void)setAnimationDelegate:(id)delegate
設置動畫代理對象,當動畫開始或者結束時會發消息給代理對象
+ (void)setAnimationWillStartSelector:(SEL)selector
當動畫即將開始時,執行delegate對象的selector,並且把beginAnimations:context:中傳入的參數傳進selector
+ (void)setAnimationDidStopSelector:(SEL)selector
當動畫結束時,執行delegate對象的selector,並且把beginAnimations:context:中傳入的參數傳進selector
//說明需要執行動畫 [UIView beginAnimations:nil context:nil]; //設置動畫持續時間 [UIView setAnimationDuration:1]; //設置轉場動畫 [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; //交換子視圖的位置 [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; //提交動畫 [UIView commitAnimations];
UIView動畫
+ (void)setAnimationDuration:(NSTimeInterval)duration //動畫的持續時間,秒為單位 + (void)setAnimationDelay:(NSTimeInterval)delay //動畫延遲delay秒后再開始 + (void)setAnimationStartDate:(NSDate *)startDate //動畫的開始時間,默認為now + (void)setAnimationCurve:(UIViewAnimationCurve)curve //動畫的節奏控制,具體看下面的”備注” + (void)setAnimationRepeatCount:(float)repeatCount //動畫的重復次數 + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses //如果設置為YES,代表動畫每次重復執行的效果會跟上一次相反 + (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)view cache:(BOOL)cache
Block動畫
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
參數解析:
duration:動畫的持續時間
delay:動畫延遲delay秒后開始
options:動畫的節奏控制
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束后,會自動調用這個block
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
參數解析:
duration:動畫的持續時間
view:需要進行轉場動畫的視圖
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束后,會自動調用這個block
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
方法調用完畢后,相當於執行了下面兩句代碼:
// 添加toView到父視圖
[fromView.superview addSubview:toView];
// 把fromView從父視圖中移除
[fromView.superview removeFromSuperview];
參數解析:
duration:動畫的持續時間
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束后,會自動調用這個block
UIImageView的幀動畫
UIImageView可以讓一系列的圖片在特定的時間內按順序顯示 .
相關屬性解析:
animationImages:要顯示的圖片(一個裝着UIImage的NSArray) .
animationDuration:完整地顯示一次animationImages中的所有圖片所需的時間 .
animationRepeatCount:動畫的執行次數(默認為0,代表無限循環)
相關方法解析:
- (void)startAnimating; 開始動畫 .
- (void)stopAnimating; 停止動畫 .
- (BOOL)isAnimating; 是否正在運行動畫.
UIActivityIndicatorView
是一個旋轉進度輪,可以用來告知用戶有一個操作正在進行中,一般用initWithActivityIndicatorStyle初始化
方法解析:
- (void)startAnimating;開始動畫
- (void)stopAnimating; 停止動畫
- (BOOL)isAnimating; 是否正在運行動畫
UIActivityIndicatorViewStyle有3個值可供選擇:
UIActivityIndicatorViewStyleWhiteLarge //大型白色指示器
UIActivityIndicatorViewStyleWhite //標准尺寸白色指示器
UIActivityIndicatorViewStyleGray //灰色指示器,用於白色背景
-