iOS開發(fā)之核心動畫

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;
  1. 用來設(shè)置CALayer在父層中的位置
  • 以父層的左上角為原點(0, 0)
@property CGPoint anchorPoint;
  1. 稱為“定位點”、“錨點”
  • 決定著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:
      1. 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

Core Animation結(jié)構(gòu)圖
Core Animation結(jié)構(gòu)圖
  • 核心動畫中所有類都遵守CAMediaTiming
  • CAAnaimation是個抽象類耕姊,不具備動畫效果,必須用它的子類才有動畫效果
  • CAAnimationGroup和CATransition才有動畫效果
    • CAAnimationGroup是個動畫組栅葡,可以同時進行縮放茉兰,旋轉(zhuǎn)。
    • CATransition是轉(zhuǎn)場動畫欣簇,界面之間跳轉(zhuǎn)都可以用轉(zhuǎn)場動畫规脸。
  • CAPropertyAnimation也是個抽象類,本身不具備動畫效果熊咽,只有子類才有
    • CABasicAnimation和CAKeyframeAnimation
      1. CABasicAnimation基本動畫莫鸭,做一些簡單效果
      • CAKeyframeAnimation幀動畫,做一些連續(xù)的流暢的動畫

開發(fā)步驟

如果不是xcode5之后的版本横殴,使用它需要先添QuartzCore.framework和引入對應的框架<QuartzCore/QuartzCore.h>

  1. 首先得有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)
    1. 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)建動畫對象脐湾,應該使用它的兩個子類:

    1. 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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末投储,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阔馋,更是在濱河造成了極大的恐慌玛荞,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件呕寝,死亡現(xiàn)場離奇詭異冲泥,居然都是意外死亡,警方通過查閱死者的電腦和手機壁涎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評論 3 392
  • 文/潘曉璐 我一進店門凡恍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人怔球,你說我怎么就攤上這事嚼酝。” “怎么了竟坛?”我有些...
    開封第一講書人閱讀 162,995評論 0 353
  • 文/不壞的土叔 我叫張陵闽巩,是天一觀的道長。 經(jīng)常有香客問我担汤,道長涎跨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評論 1 292
  • 正文 為了忘掉前任崭歧,我火速辦了婚禮隅很,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘率碾。我一直安慰自己叔营,他們只是感情好,可當我...
    茶點故事閱讀 67,245評論 6 388
  • 文/花漫 我一把揭開白布所宰。 她就那樣靜靜地躺著绒尊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪仔粥。 梳的紋絲不亂的頭發(fā)上婴谱,一...
    開封第一講書人閱讀 51,208評論 1 299
  • 那天,我揣著相機與錄音躯泰,去河邊找鬼谭羔。 笑死,一個胖子當著我的面吹牛斟冕,可吹牛的內(nèi)容都是我干的口糕。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼磕蛇,長吁一口氣:“原來是場噩夢啊……” “哼景描!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起秀撇,我...
    開封第一講書人閱讀 38,929評論 0 274
  • 序言:老撾萬榮一對情侶失蹤超棺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呵燕,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棠绘,經(jīng)...
    沈念sama閱讀 45,346評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,570評論 2 333
  • 正文 我和宋清朗相戀三年再扭,在試婚紗的時候發(fā)現(xiàn)自己被綠了氧苍。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,739評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡泛范,死狀恐怖让虐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情罢荡,我是刑警寧澤赡突,帶...
    沈念sama閱讀 35,437評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站区赵,受9級特大地震影響惭缰,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜笼才,卻給世界環(huán)境...
    茶點故事閱讀 41,037評論 3 326
  • 文/蒙蒙 一漱受、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骡送,春花似錦拜效、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至昌渤,卻和暖如春赴穗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膀息。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評論 1 269
  • 我被黑心中介騙來泰國打工般眉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人潜支。 一個月前我還...
    沈念sama閱讀 47,760評論 2 369
  • 正文 我出身青樓甸赃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冗酿。 傳聞我的和親對象是個殘疾皇子埠对,可洞房花燭夜當晚...
    茶點故事閱讀 44,647評論 2 354

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

  • 在iOS中隨處都可以看到絢麗的動畫效果络断,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺ios動畫全貌项玛。在這里你可以看...
    每天刷兩次牙閱讀 8,485評論 6 30
  • 在iOS中隨處都可以看到絢麗的動畫效果貌笨,實現(xiàn)這些動畫的過程并不復雜,今天將帶大家一窺iOS動畫全貌襟沮。在這里你可以看...
    F麥子閱讀 5,110評論 5 13
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫锥惋,核心動畫,幀動畫开伏,自定義轉(zhuǎn)場動畫膀跌。 1.UIView...
    請叫我周小帥閱讀 3,092評論 1 23
  • Core Animation Core Animation,中文翻譯為核心動畫固灵,它是一組非常強大的動畫處理API捅伤,...
    45b645c5912e閱讀 3,028評論 0 21
  • 概覽 在iOS中隨處都可以看到絢麗的動畫效果,實現(xiàn)這些動畫的過程并不復雜怎虫,今天將帶大家一窺iOS動畫全貌暑认。在這里你...
    Yiart閱讀 3,810評論 3 34