iOS - 核心動畫

作者:Mitchell 

一、基本概念

  • CoreAnimation 可用在 Mac OS X和iOS平臺
  • CoreAnimation 的動畫執(zhí)行過程都是在后臺操作的具垫,不會阻塞主線程碉碉。
  • CoreAnimation 是直接作用在CALayer 上的边苹,并不是UIView。
  • 用一張圖來簡要介紹一下核心動畫成員之間的關(guān)系杜顺。
圖1.png
  • 為何要封裝成這么多的類财搁?
    • 體現(xiàn)了面向?qū)ο蟮奶匦裕褪敲總€對象都控制著不同的特性躬络,每個類控制動畫一方面尖奔。

二、基本動畫

  • CAAnimation
    • 是多有動畫對象的父類穷当,負(fù)責(zé)控制動畫的持續(xù)時間和速度提茁,是個抽象類,不能直接使用馁菜。
    • 屬性的簡單說明:
      • duration:動畫的持續(xù)時間
      • repeatCount:重復(fù)次數(shù)茴扁,無線循環(huán)可設(shè)置為HUGE_VALF或者MAXFLOAT
      • removeOnCompletion:默認(rèn)為YES,代表動畫執(zhí)行完畢后就從圖層上移除火邓,圖形會恢復(fù)到動畫執(zhí)行前的狀態(tài)丹弱,如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)德撬,那就設(shè)置為NO,不過還要設(shè)置fillMode為kCAFillMOdeForwards躲胳。
      • fillModes:決定當(dāng)前對象在非 active 時間段的行為蜓洪。比如動畫開始之前或者動畫結(jié)束之后
      • beginTime:可以用來設(shè)置動畫延遲執(zhí)行的時間,如果想延遲10S坯苹,就設(shè)置為CACurrentMediaTime()+2隆檀。 CACurrentMediaTime()為圖層的當(dāng)前時間
      • timingFunction:速度控制函數(shù),控制畫運行的節(jié)奏
      • delegate:動畫代理
    • fillMode 屬性值(要想 fillMode 有效粹湃,最好設(shè)置removedOnComletion = NO)
      • kCAFillModeRemoved 這個是默認(rèn)值恐仑,也就是說當(dāng)動畫開始前和動畫結(jié)束后,動畫對layer都沒有影響为鳄,動畫結(jié)束后裳仆,layer會恢復(fù)到之前的狀態(tài)
      • kCAFillModeForwards 當(dāng)動畫結(jié)束后,layer會一直保持著動畫最后的狀態(tài)
      • kCAFillModeBackwards 在動畫開始前孤钦,只需要將動畫加入了一個layer歧斟,layer便立即進入動畫的初始狀態(tài)并等待動畫開始。
      • kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入后開始之前偏形,layer便處于動畫初始狀態(tài)静袖,動畫結(jié)束后layer保持動畫最后的狀態(tài)
    • 速度控制函數(shù)(CAMediaTimingFunction)
      • kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態(tài)的感覺
      • kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入俊扭,然后加速離開
      • kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入队橙,然后減速的到達(dá)目的地
      • kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速萨惑,然后減速的到達(dá)目的地捐康。這個是默認(rèn)的動畫行為。
  • CAPropertyAnimation
    • 是 CAAnimation 的子類庸蔼,也是抽象類吹由,要想創(chuàng)建動畫對象,應(yīng)該使用它的兩個子類:
      • CABasicAnimation
      • CAKeyframeAnimation
    • keyPath:通過指定 CALayer 的屬性名稱keyPath朱嘴,對layer的這個屬性的值進行修改倾鲫,達(dá)到相應(yīng)的動畫效果。比如@“position” 是修改 position 達(dá)到移動的效果萍嬉。
  • CABasicAniamtion
    • 基本動畫是 CAPropertyAnimation 的子類
    • 屬性說明
      • fromValue:keyPath相應(yīng)屬性的初始值
      • toValue:keyPath相應(yīng)屬性的結(jié)束值

三乌昔、關(guān)鍵幀動畫

  • CAKeyframeAnimation
    • 關(guān)鍵幀動畫,是CAPropertyAnimation的子類
    • 與 CABasicAniamtion 的區(qū)別是 CABasicAniamtion 是從fromValue 到 toValue 兩個值的變化壤追,而 CAKeyframeAnimation 可以使用 NSArray 來保存這些數(shù)值磕道。
    • 屬性說明:
      • values:NSArray 對象,里面的元素就是“關(guān)鍵幀”行冰,動畫會在指定的時間內(nèi)溺蕉,依次顯示 values 數(shù)組中的每一個關(guān)鍵幀伶丐。
      • path:可以設(shè)置CGPathRef、CGMutablePathRef疯特,讓圖層按照軌跡移動哗魂,path只對CALayer的 anchorPoint 和 point 起作用。如果設(shè)置了 path漓雅, 那么values將被忽略录别。
      • keyTimes:關(guān)鍵幀指定對應(yīng)的時間點,取值范圍從0~1邻吞,keyTimes中的每一個時間值對應(yīng)values中的每一幀组题,如果沒有設(shè)置,時間是平分的抱冷。
    • CABasicAniamtion 可看做 只有兩個關(guān)鍵幀的 CAKeyframeAnimation崔列。

四、動畫組

  • CAAnimationGroup
    • 是 CAAnimation 的子類旺遮,可以保存一組動畫對象峻呕,將 CAAnimationGroup 對象加入層之后,族中所有的動畫對象可以同時并發(fā)運行趣效。
    • 屬性說明:
      • animations:保存一組動畫對象的NSArray。
      • 默認(rèn)情況下猪贪,一組動畫對象是同時運行的跷敬,也可以通過設(shè)置動畫對象的 beginTimer 屬性來更改動畫的開始時間

五热押、轉(zhuǎn)場動畫

  • CATransition
    • 為層提供移出屏幕和移入屏幕的動畫效果西傀。
    • UINavigationController就是通過CATransition實現(xiàn)了將控制器推入屏幕的動畫效果
    • 動畫屬性:
      • type:動畫過渡類型
      • subtype:動畫過渡方向
      • startProgress:動畫起點
      • endProgress:動畫終點

六、實際應(yīng)用

  • CABasicAnimation:
CABasicAnimation *ani3 = [CABasicAnimation animation];
    ani3.keyPath = @"opacity";
    ani3.fromValue = @1;
    ani3.toValue = @0;
    ani3.duration = 1;
    ani3.repeatCount = MAXFLOAT;
    ani3.removedOnCompletion = NO;
    ani3.fillMode = kCAFillModeBackwards;
  • CAKeyframeAnimation
    • 按照路徑移動
CAKeyframeAnimation* ani = [CAKeyframeAnimation animation];
    ani.keyPath = @"position";
    UIBezierPath *path =[UIBezierPath bezierPathWithArcCenter:_img.center radius:100 startAngle:0 endAngle:M_PI*2 clockwise:YES];
    ani.path = path.CGPath;
    ani.repeatCount = MAXFLOAT;
    ani.duration = 2;
    ani.removedOnCompletion = NO;
    ani.fillMode = kCAFillModeBoth;
- 抖動
#define angle2Radion(angle) (angle / 180.0 * M_PI)
CAKeyframeAnimation*ani2 = [CAKeyframeAnimation animation];
    ani2.keyPath = @"transform.rotation";
    ani2.values = @[@(angle2Radion(-5)),@(angle2Radion(5)),@(angle2Radion(-5))];
    ani2.duration = 0.15;
    ani2.repeatCount = MAXFLOAT;
  • CAAnimationGroup
  • `注意`:每一次group循環(huán)內(nèi)的動畫仍舊是由每個動畫各自的屬性控制桶癣,`有一點需要注意就是duration這個屬性拥褂,為了保證動畫的連貫性,group的duration屬性最好設(shè)置成與動畫數(shù)組內(nèi)時間最長的動畫一致牙寞。` 
    
 //group
    CAAnimationGroup *group = [CAAnimationGroup animation];
 //位移
    CAKeyframeAnimation* ani = [CAKeyframeAnimation animation];
    ani.keyPath = @"position";
    UIBezierPath *path =[UIBezierPath bezierPathWithArcCenter:_img.center radius:100 startAngle:0 endAngle:M_PI*2 clockwise:YES];
    ani.path = path.CGPath;
    ani.repeatCount = MAXFLOAT;
    ani.duration = 2;
    ani.removedOnCompletion = NO;
    ani.fillMode = kCAFillModeBoth;
 //抖動
    CAKeyframeAnimation*ani2 = [CAKeyframeAnimation animation];
    ani2.keyPath = @"transform.rotation";
    ani2.values = @[@(angle2Radion(-5)),@(angle2Radion(5)),@(angle2Radion(-5))];
    ani2.duration = 0.15;
    ani2.repeatCount = MAXFLOAT;
//透明度
    CABasicAnimation *ani3 = [CABasicAnimation animation];
    ani3.keyPath = @"opacity";
    ani3.fromValue = @1;
    ani3.toValue = @0;
    ani3.duration = 1;
    ani3.repeatCount = MAXFLOAT;
    ani3.removedOnCompletion = NO;
    ani3.fillMode = kCAFillModeBackwards;
//將動畫添加進group
    group.animations = @[ani,ani2,ani3];
    group.duration = 2;
    group.repeatCount = MAXFLOAT;
    group.removedOnCompletion = NO;
    group.fillMode = kCAFillModeBackwards;
    [_img.layer addAnimation:group forKey:nil];
  • CATransition
// 界面切換的代碼
    static int i = 2;
    NSString *imageName = [NSString stringWithFormat:@"%d",i];
    _imageView.image = [UIImage imageNamed:imageName];
    i++;
    if (i > 3) {
        i = 1;
    }
    // 只要切換界面 都可以使用轉(zhuǎn)場動畫
    // 誰切換界面 就添加到誰上
    // 轉(zhuǎn)場動畫代碼必須和界面切換的代碼放在一起
    // 轉(zhuǎn)場動畫
    CATransition *anim = [CATransition animation];
    // 指定轉(zhuǎn)場類型
    anim.type = @"pageCurl";
    // 設(shè)置轉(zhuǎn)場的方向
    anim.subtype = kCATransitionFromLeft;
    // 設(shè)置動畫的進度
    anim.startProgress = 0;
    anim.endProgress = 1;
    anim.duration = 0.5;
    [_imageView.layer addAnimation:anim forKey:nil];

七饺鹃、核心動畫與UIView動畫的區(qū)別

  • 核心動畫的一切都是假象,并不會真是改變layer的值
  • UIView 真實改變屬性才能有動畫
  • 使用場景:
    • UIView 用在需要交互的地方
    • 核心動畫用在不需要交互的地方间雀。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末悔详,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子惹挟,更是在濱河造成了極大的恐慌茄螃,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件连锯,死亡現(xiàn)場離奇詭異归苍,居然都是意外死亡用狱,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門拼弃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來夏伊,“玉大人,你說我怎么就攤上這事肴敛∈鸷#” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵医男,是天一觀的道長砸狞。 經(jīng)常有香客問我,道長镀梭,這世上最難降的妖魔是什么刀森? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮报账,結(jié)果婚禮上研底,老公的妹妹穿的比我還像新娘。我一直安慰自己透罢,他們只是感情好榜晦,可當(dāng)我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著羽圃,像睡著了一般乾胶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朽寞,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天识窿,我揣著相機與錄音,去河邊找鬼脑融。 笑死喻频,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的肘迎。 我是一名探鬼主播甥温,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼妓布!你這毒婦竟也來了窿侈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤秋茫,失蹤者是張志新(化名)和其女友劉穎史简,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡圆兵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年跺讯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片殉农。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡刀脏,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出超凳,到底是詐尸還是另有隱情愈污,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布轮傍,位于F島的核電站暂雹,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏创夜。R本人自食惡果不足惜杭跪,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望驰吓。 院中可真熱鬧涧尿,春花似錦、人聲如沸檬贰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽翁涤。三九已至桥言,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迷雪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工虫蝶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留章咧,地道東北人。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓能真,卻偏偏與公主長得像赁严,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子粉铐,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Core Animation Core Animation疼约,中文翻譯為核心動畫,它是一組非常強大的動畫處理API蝙泼,...
    45b645c5912e閱讀 3,034評論 0 21
  • "小畫板程序"完成"小畫板"程序程剥。 下載地址:http://git.oschina.net/changyou/my...
    _淺墨_閱讀 695評論 0 5
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫,核心動畫汤踏,幀動畫织鲸,自定義轉(zhuǎn)場動畫舔腾。 1.UIView...
    請叫我周小帥閱讀 3,114評論 1 23
  • 核心動畫(Core Animation) 一、Core animation簡單介紹 1.Core Animatio...
    亦晴工作室閱讀 547評論 0 0
  • 一搂擦、關(guān)于核心動畫的介紹 1稳诚、核心動畫作用于layer層, layer有兩個屬性Position和achroPoin...
    GPUImage閱讀 315評論 0 0