iOS Core Animation 核心動畫

做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)诞丽。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末鲸拥,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子僧免,更是在濱河造成了極大的恐慌刑赶,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件懂衩,死亡現(xiàn)場離奇詭異撞叨,居然都是意外死亡,警方通過查閱死者的電腦和手機浊洞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門牵敷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人法希,你說我怎么就攤上這事枷餐。” “怎么了苫亦?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵毛肋,是天一觀的道長。 經(jīng)常有香客問我著觉,道長村生,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任饼丘,我火速辦了婚禮趁桃,結果婚禮上,老公的妹妹穿的比我還像新娘肄鸽。我一直安慰自己卫病,他們只是感情好,可當我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布典徘。 她就那樣靜靜地躺著蟀苛,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逮诲。 梳的紋絲不亂的頭發(fā)上帜平,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天,我揣著相機與錄音梅鹦,去河邊找鬼裆甩。 笑死,一個胖子當著我的面吹牛齐唆,可吹牛的內容都是我干的嗤栓。 我是一名探鬼主播,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼茉帅!你這毒婦竟也來了叨叙?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤堪澎,失蹤者是張志新(化名)和其女友劉穎擂错,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體樱蛤,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡马昙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刹悴。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡攒暇,死狀恐怖土匀,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情形用,我是刑警寧澤就轧,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站田度,受9級特大地震影響妒御,放射性物質發(fā)生泄漏。R本人自食惡果不足惜镇饺,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一乎莉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奸笤,春花似錦惋啃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至健盒,卻和暖如春绒瘦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背扣癣。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工惰帽, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人搏色。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓善茎,卻偏偏與公主長得像,于是被迫代替她去往敵國和親频轿。 傳聞我的和親對象是個殘疾皇子垂涯,可洞房花燭夜當晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內容