做iOS開發(fā)已經(jīng)有三年了旭咽,之前遇到動畫效果都是零零碎碎的研究因块,作為一個iOS開發(fā)者是時候整理一下核心動畫相關的資料了梦裂。
基礎
- Core Animation可以用在Mac OS X和iOS平臺菠剩。
- Core Animation的動畫執(zhí)行過程都是在后臺操作的戳表,不會阻塞主線程。
- 還有一點需要注意:Core Animation是直接作用在CALayer上的歌懒,并非UIView啦桌。
使用步驟
1.首先得有CALayer
2.初始化一個CAAnimation對象,并設置一些動畫相關屬性
3.通過調用CALayer的addAnimation:forKey:方法及皂,添加CAAnimation對象到CALayer中甫男,這樣就能開始執(zhí)行動畫了
4.通過調用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫
詳細介紹
-
要想執(zhí)行動畫,就必須初始化一個CAAnimation對象验烧。下面介紹CAAnimation
- 核心動畫中所有類都遵守CAMediaTiming
- 注意:CAAnaimation是個抽象類板驳,不具備動畫效果,CAPropertyAnimation也是個抽象類碍拆,本身不具備動畫效果若治,只有它們的子類才有
可用動畫類 : CAAnimationGroup 、CATransition感混、CABasicAnimation和CAKeyframeAnimation
- CAAnimationGroup:動畫組端幼,可以同時進行縮放,旋轉等動畫
- CATransition:轉場動畫弧满,界面之間跳轉都可以用轉場動畫
- CABasicAnimation:基本動畫婆跑,做一些簡單效果
- CAKeyframeAnimation:幀動畫,做一些連續(xù)的流暢的動畫
CAAnimation的常用屬性
duration:動畫的持續(xù)時間
repeatCount:動畫的重復次數(shù)
timingFunction:控制動畫運行的節(jié)奏
---> timingFunction可選的值有:
--- kCAMediaTimingFunctionLinear(線性):勻速庭呜,給你一個相對靜態(tài)的感覺
--- kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入滑进,然后加速離開
--- kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入摹迷,然后減速的到達目的地
--- kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速郊供,然后減速的到達目的地。這個是默認的動畫行為近哟。
delegate:動畫代理(CAAnimationDelegate)驮审,用來監(jiān)聽動畫的執(zhí)行過程
@interface NSObject (CAAnimationDelegate) // 動畫開始執(zhí)行的時候觸發(fā)這個方法
- (void)animationDidStart:(CAAnimation *)anim; // 動畫執(zhí)行完畢的時候觸發(fā)這個方法
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end```
// 創(chuàng)建基本動畫CABasicAnimation *animation = [CABasicAnimation animation];
// 設置動畫類型animation.keyPath = @"transform";
// 設置動畫結束后不刪除動畫animation.removedOnCompletion = NO;
// 設置動畫結束后的最新狀態(tài)animation.fillMode = kCAFillModeForwards;
// 設置動畫時長animation.duration = 4;
// 設置移動位置animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0, 0, 1)];[self.myLayer addAnimation:animation forKey:nil];
####CABaseAnimation
CAPropertyAnimation的子類
屬性解析:
**fromValue**:keyPath相應屬性的初始值
**byValue**:可選值
**toValue**:keyPath
相應屬性的結束值隨著動畫的進行,在長度為`duration`的持續(xù)時間內吉执,`keyPath`相應屬性的值從`fromValue`漸漸地變?yōu)閌toValue`
**Attention**:如果`fillMode=kCAFillModeForwards`和`removedOnComletion=NO`
疯淫,那么在動畫執(zhí)行完畢后,圖層會保持顯示動畫執(zhí)行后的狀態(tài)戳玫。但在實質上熙掺,圖層的屬性值還是動畫執(zhí)行前的初始值,并沒有真正被改變咕宿。比如币绩,`CALayer`的`position`初始值為(0,0),`CABasicAnimation`的`fromValue`為(10,10)府阀,toValue為(100,100)缆镣,雖然動畫執(zhí)行完畢后圖層保持在(100,100)這個位置,實質上圖層的position還是為(0,0)
// 創(chuàng)建基本動畫
CABasicAnimation *animation = [CABasicAnimation animation];
// 設置動畫類型
animation.keyPath = @"transform";
// 設置動畫結束后不刪除動畫
animation.removedOnCompletion = NO;
// 設置動畫結束后的最新狀態(tài)
animation.fillMode = kCAFillModeForwards;
// 設置動畫時長
animation.duration = 4;
// 設置移動位置
animation.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 0, 0, 1)];
[self.myLayer addAnimation:animation forKey:nil];```
CAKeyFrameAnimation
兩者的區(qū)別
CABasicAnimation:
只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)
CAKeyframeAnimation:
會使用一個NSArray保存這些數(shù)值
CABasicAnimation可看做是只有2個關鍵幀的CAKeyframeAnimation關鍵幀動畫
values 關鍵幀數(shù)組
上述的NSArray對象试浙。里面的元素稱為“關鍵幀”(keyframe)董瞻。
動畫對象會在指定的時間(duration)內,依次顯示values數(shù)組中的每一個關鍵幀
path 路徑軌跡
path:可以設置一個CGPathRef田巴、CGMutablePathRef钠糊,讓圖層按照路徑軌跡移動。
path只對CALayer的anchorPoint和position起作用壹哺。
注意:如果設置了path抄伍,那么values關鍵幀將被忽略
keyTimes:關鍵幀所對應的時間點
keyTimes:可以為對應的關鍵幀指定對應的時間點,其取值范圍為0到1.0
keyTimes中的每一個時間值都對應values中的每一幀斗躏。如果沒有設置keyTimes逝慧,各個關鍵幀的時間是平分的
removedOnCompletion:默認為YES
代表動畫執(zhí)行完畢后就從圖層上移除,圖形會恢復到動畫執(zhí)行前的狀態(tài)啄糙。如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)笛臣,那就設置為NO,不過還要設置fillMode為kCAFillModeForwards
fillMode:決定當前對象在非active時間段的行為.
比如動畫開始之前,動畫結束之后
beginTime:可以用來設置動畫延遲執(zhí)行時間
若想延遲2s隧饼,就設置為CACurrentMediaTime()+2沈堡,CACurrentMediaTime()為圖層的當前時間
timingFunction:速度控制函數(shù)
控制動畫運行的節(jié)奏
CGPoint fromPoint = sublayer.frame.origin;
//路徑曲線
UIBezierPath *movePath = [UIBezierPath bezierPath];
[movePath moveToPoint:fromPoint];
CGPoint toPoint = CGPointMake(30, 360);
[movePath addQuadCurveToPoint:toPoint
controlPoint:CGPointMake(300,0)];
//關鍵幀
CAKeyframeAnimation *moveAnim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
moveAnim.path = movePath.CGPath;
moveAnim.removedOnCompletion = YES;
moveAnim.duration = 3;
moveAnim.delegate = self;
//旋轉變化
CABasicAnimation *scaleAnim = [CABasicAnimation animationWithKeyPath:@"transform"];
scaleAnim.fromValue = [NSValue valueWithCATransform3D:CATransform3DIdentity];
//x,y軸縮小到0.1,Z 軸不變
scaleAnim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(0.1, 0.1, 1.0)];
scaleAnim.removedOnCompletion = YES;
scaleAnim.duration = 5;
scaleAnim.delegate = self;
//透明度變化
CABasicAnimation *opacityAnim = [CABasicAnimation animationWithKeyPath:@"alpha"];
opacityAnim.fromValue = [NSNumber numberWithFloat:1.0];
opacityAnim.toValue = [NSNumber numberWithFloat:0.1];
opacityAnim.removedOnCompletion = YES;
opacityAnim.delegate = self; ```
keyPath可以使用的key
-
define angle2Radian(angle) ((angle)/180.0*M_PI)
transform.rotation.x 圍繞x軸翻轉 參數(shù):角度 angle2Radian(4)
transform.rotation.y 圍繞y軸翻轉 參數(shù):同上
transform.rotation.z 圍繞z軸翻轉 參數(shù):同上
transform.rotation 默認圍繞z軸
transform.scale.x x方向縮放 參數(shù):縮放比例 1.5
transform.scale.y y方向縮放 參數(shù):同上
transform.scale.z z方向縮放 參數(shù):同上
transform.scale 所有方向縮放 參數(shù):同上
transform.translation.x x方向移動 參數(shù):x軸上的坐標 100
transform.translation.y x方向移動 參數(shù):y軸上的坐標
transform.translation.z x方向移動 參數(shù):z軸上的坐標
transform.translation 移動 參數(shù):移動到的點 (100燕雁,100)
opacity 透明度 參數(shù):透明度 0.5
backgroundColor 背景顏色 參數(shù):顏色 (id)[[UIColor redColor] CGColor]
cornerRadius 圓角 參數(shù):圓角半徑 5
borderWidth 邊框寬度 參數(shù):邊框寬度 5
bounds 大小 參數(shù):CGRect
contents 內容 參數(shù):CGImage
contentsRect 可視內容 參數(shù):CGRect 值是0~1之間的小數(shù)
hidden 是否隱藏
position
shadowColor
shadowOffset
shadowOpacity
shadowRadius
歡迎關注我的[微博](http://weibo.com/u/2209572342/home?topnav=1&wvr=6&mod=logo)和[博客](http://dwz.cn/iOS_BK)诞丽。