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

1、概述

Core Animation是一組非常強大的動畫處理API员萍,使用它能做出非常炫麗的動畫效果瞒大,而且往往是事半功倍,使用它需要先添加QuartzCore.framework和引入對應(yīng)的框架<QuartzCore/QuartzCore.h>俊性。

特別注意的是核心動畫的動畫效果只是“假象”略步,產(chǎn)生動畫的那個view實際上并未發(fā)生任何變化。

開發(fā)步驟:

第一步:初始化一個動畫對象(CAAnimation)并設(shè)置一些動畫相關(guān)屬性定页。

第二步:添加動畫對象到層(CALayer)中趟薄,開始執(zhí)行動畫。

CALayer中很多屬性都可以通過CAAnimation實現(xiàn)動畫效果典徊,包括:opacity杭煎、position恩够、transformbounds羡铲、contents等(可以在API文檔中搜索:CALayer Animatable Properties)蜂桶。

通過調(diào)用CALayer的addAnimation:forKey增加動畫到層(CALayer)中,這樣就能觸發(fā)動畫了也切。通過調(diào)用removeAnimationForKey可以停止層中的動畫扑媚。

Core Animation的動畫執(zhí)行過程都是在后臺操作的,不會阻塞主線程雷恃。Core Animation的使用步驟:

第一步:使用它需要先添加QuartzCore.framework框架和引入主頭文件疆股。

第二步:初始化一個CAAnimation對象,并設(shè)置一些動畫相關(guān)屬性褂萧。

第三步:通過調(diào)用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中押桃,這樣就能開始執(zhí)行動畫了。

第四步:通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫导犹。

2CAAnimation繼承結(jié)構(gòu)

上圖中的黑色虛線代表”繼承”某個類羡忘,紅色虛線代表“遵守”某個協(xié)議谎痢。

所有動畫對象的父類,負責控制動畫的持續(xù)時間和速度卷雕,是個抽象類节猿,不能直接使用,應(yīng)該使用它具體的子類漫雕。

屬性解析:(紅色代表來自CAMediaTiming協(xié)議的屬性):

duration:動畫的持續(xù)時間

repeatCount:動畫的重復(fù)次數(shù)

repeatDuration:動畫的重復(fù)時間

removedOnCompletion:默認為YES滨嘱,代表動畫執(zhí)行完畢后就從圖層上移除,圖形會恢復(fù)到動畫執(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:動畫代理

速度控制函數(shù)(CAMediaTimingFunction):

(1)kCAMediaTimingFunctionLinear(線性):勻速锥咸,給你一個相對靜態(tài)的感覺

(2)kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入,然后加速離開

(3)kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入细移,然后減速的到達目的地

(4)kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入搏予,中間加速,然后減速的到達目的地弧轧。這個是默認的動畫行為雪侥。

CAAnimation在分類中定義了代理方法:

Objective-C

@interface??NSObject?(CAAnimationDelegate)

-?(void)animationDidStart:(CAAnimation?*)anim;

-?(void)animationDidStop:(CAAnimation?*)anim?finished:(BOOL)flag;

@end

fillMode屬性值(要想fillMode有效球涛,最好設(shè)置removedOnCompletion=NO)。

kCAFillModeRemoved這個是默認值,也就是說當動畫開始前和動畫結(jié)束后,動畫對layer都沒有影響,動畫結(jié)束后,layer會恢復(fù)到之前的狀態(tài)校镐。

kCAFillModeForwards當動畫結(jié)束后,layer會一直保持著動畫最后的狀態(tài)亿扁。

kCAFillModeBackwards在動畫開始前,你只要將動畫加入了一個layer,layer便立即進入動畫的初始狀態(tài)并等待動畫開始.你可以這樣設(shè)定測試代碼,將一個動畫加入一個layer的時候延遲5秒執(zhí)行.然后就會發(fā)現(xiàn)在動畫沒有開始的時候,只要動畫被加入了layer,layer便處于動畫初始狀態(tài)。

kCAFillModeBoth這個其實就是上面兩個的合成.動畫加入后開始之前,layer便處于動畫初始狀態(tài),動畫結(jié)束后layer保持動畫最后的狀態(tài)鸟廓。

CALayer上動畫的暫停和恢復(fù):

Objective-C

//?t?-?active?local?time???圖層的本地時間

//?tp?-?parent?layer?time??父圖層的時間

//?父圖層和圖層本地的時間換算公式

//?t?=?(tp?-?beginTime)?*?speed?+?timeOffset

//?beginTime?=?tp?-?(t?-?timeOffset)/speed

#pragma?mark?暫停CALayer的動畫

-(void)pauseLayer:(CALayer*)layer

{

CFTimeInterval?pausedTime?=

?[layer?convertTime:CACurrentMediaTime()?fromLayer:nil];

????layer.speed?=?0.0;?//?讓CALayer的時間停止走動

????layer.timeOffset?=?pausedTime;?//?讓CALayer的時間停留在pausedTime這個時刻

}

#pragma?mark?恢復(fù)CALayer的動畫

-(void)resumeLayer:(CALayer*)layer

{

????CFTimeInterval?pausedTime?=?layer.timeOffset;

????layer.speed?=?1.0;?//?讓CALayer的時間繼續(xù)行走

????layer.timeOffset?=?0.0;?//?取消上次記錄的停留時刻

????layer.beginTime?=?0.0;?//?取消上次設(shè)置的時間


????//?計算暫停的時間(這里用CACurrentMediaTime()-pausedTime也是一樣的)

????CFTimeInterval?timeSincePause?=?[layer?convertTime:CACurrentMediaTime()?fromLayer:nil]?-?pausedTime;

????//?設(shè)置相對于父坐標系的開始時間(往后退timeSincePause)

????layer.beginTime?=?timeSincePause;

}

3从祝、CAPropertyAnimation

是CAAnimation的子類,也是個抽象類引谜,要想創(chuàng)建動畫對象牍陌,應(yīng)該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation。

屬性解析:

keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型)员咽,并且對CALayer的這個屬性的值進行修改毒涧,達到相應(yīng)的動畫效果。比如贝室,指定@”position”為keyPath契讲,就修改CALayer的position屬性的值,以達到平移的動畫效果滑频。

4捡偏、CABasicAnimation

CAPropertyAnimation的子類,支持一些簡單的動畫峡迷。

屬性解析:

fromValue:keyPath相應(yīng)屬性的初始值

toValue:keyPath相應(yīng)屬性的結(jié)束值

隨著動畫的進行银伟,在長度為duration的持續(xù)時間內(nèi),keyPath相應(yīng)屬性的值從fromValue漸漸地變?yōu)閠oValue绘搞。

如果fillMode=kCAFillModeForwardsremovedOnComletion=NO彤避,那么在動畫執(zhí)行完畢后,圖層會保持顯示動畫執(zhí)行后的狀態(tài)夯辖。但在實質(zhì)上琉预,圖層的屬性值還是動畫執(zhí)行前的初始值,并沒有真正被改變楼雹。比如模孩,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10)贮缅,toValue為(100,100)榨咐,雖然動畫執(zhí)行完畢后圖層保持在(100,100)這個位置,實質(zhì)上圖層的position還是為(0,0)谴供。

例如:

Objective-C

//?平移動畫

//第一步:創(chuàng)建動畫對象

CABasicAnimation?*anim?=

[CABasicAnimation?animationWithKeyPath:@"position"];

//第二步:設(shè)置動畫對象

anim.duration?=?1;?//?動畫持續(xù)1秒

//?因為CGPoint是結(jié)構(gòu)體块茁,所以用NSValue包裝成一個OC對象

anim.fromValue?=?[NSValue?valueWithCGPoint:CGPointMake(50,?50)];

anim.toValue?=?[NSValue?valueWithCGPoint:CGPointMake(100,?100)];

//第三步:添加動畫

[layer?addAnimation:anim?forKey:@"MyAnim"];

//?通過MyAnim可以取回相應(yīng)的動畫對象,比如用來中途取消動畫

//?縮放動畫

CABasicAnimation?*anim?=

[CABasicAnimation?animationWithKeyPath:@"transform"];

//?沒有設(shè)置fromValue說明當前狀態(tài)作為初始值

//?寬度(width)變?yōu)樵瓉淼?倍,高度(height)變?yōu)樵瓉淼?.5倍

anim.toValue?=

[NSValue?valueWithCATransform3D:CATransform3DMakeScale(2,?1.5,?1)];

anim.duration?=?1;

[layer?addAnimation:anim?forKey:nil];

//?旋轉(zhuǎn)動畫

CABasicAnimation?*anim?=

[CABasicAnimation?animationWithKeyPath:@"transform"];

//?這里是以向量(1,?1,?0)為軸数焊,旋轉(zhuǎn)π/2弧度(90°)

//?如果只是在手機平面上旋轉(zhuǎn)永淌,就設(shè)置向量為(0,?0,?1),即Z軸

anim.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2,?1,?1,?0)];

anim.duration?=?1;

[layer?addAnimation:anim?forKey:nil];

5佩耳、CAKeyframeAnimation

CApropertyAnimation的子類遂蛀,可以創(chuàng)造幀動畫。跟CABasicAnimation的區(qū)別是:CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)干厚,而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值李滴。

屬性解析:

values:就是上述的NSArray對象。里面的元素稱為”關(guān)鍵幀”(keyframe)蛮瞄。動畫對象會在指定的時間(duration)內(nèi)所坯,依次顯示values數(shù)組中的每一個關(guān)鍵幀

path:可以放一個數(shù)組。比如設(shè)置一個CGPathRef\CGMutablePathRef,讓層跟著路徑移動挂捅。path只對CALayer的anchorPoint和position起作用芹助。如果你設(shè)置了path,那么values將被忽略

keyTimes:可以為對應(yīng)的關(guān)鍵幀指定對應(yīng)的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應(yīng)values中的每一幀.當keyTimes沒有設(shè)置的時候,各個關(guān)鍵幀的時間是平分的

CABasicAnimation可看做是最多只有2個關(guān)鍵幀的CAKeyframeAnimation闲先。

在關(guān)鍵幀動畫中還有一個非常重要的參數(shù),那便是calculationMode,計算模式.其主要針對的是每一幀的內(nèi)容為一個座標點的情況,也就是對anchorPoint 和 position 進行的動畫.當在平面座標系中有多個離散的點的時候,可以是離散的,也可以直線相連后進行插值計算,也可以使用圓滑的曲線將他們相連后進行插值計算. calculationMode目前提供如下幾種模式:

kCAAnimationLinearcalculationMode的默認值,表示當關(guān)鍵幀為座標點的時候,關(guān)鍵幀之間直接直線相連進行插值計算;

kCAAnimationDiscrete離散的,就是不進行插值計算,所有關(guān)鍵幀直接逐個進行顯示;

kCAAnimationPaced使得動畫均勻進行,而不是按keyTimes設(shè)置的或者按關(guān)鍵幀平分時間,此時keyTimes和timingFunctions無效;

kCAAnimationCubic對關(guān)鍵幀為座標點的關(guān)鍵幀進行圓滑曲線相連后插值計算状土,這里的主要目的是使得運行的軌跡變得圓滑;

kCAAnimationCubicPaced看這個名字就知道和kCAAnimationCubic有一定聯(lián)系,其實就是在kCAAnimationCubic的基礎(chǔ)上使得動畫運行變得均勻,就是系統(tǒng)時間內(nèi)運動的距離相同,此時keyTimes以及timingFunctions也是無效的

例如:

示例代碼一:

Objective-C

CAKeyframeAnimation?*anim?=?[CAKeyframeAnimation?animation];


????anim.keyPath?=?@"position";


????NSValue?*v1?=?[NSValue?valueWithCGPoint:CGPointZero];

????NSValue?*v2?=?[NSValue?valueWithCGPoint:CGPointMake(100,?0)];

????NSValue?*v3?=?[NSValue?valueWithCGPoint:CGPointMake(100,?200)];

????NSValue?*v4?=?[NSValue?valueWithCGPoint:CGPointMake(0,?200)];

????anim.values?=?@[v1,?v2,?v3,?v4];


????//?anim.keyTimes?=?@[@(0.5),?@(0.25),?@(0.25)];//控制每一幀的時間


????anim.duration?=?2.0;



????anim.removedOnCompletion?=?NO;

????anim.fillMode?=?kCAFillModeForwards;


[self.redView.layer?addAnimation:anim?forKey:nil];

示例代碼二:

Objective-C

CAKeyframeAnimation?*anim?=?[CAKeyframeAnimation?animation];


????anim.keyPath?=?@"position";

????anim.removedOnCompletion?=?NO;

????anim.fillMode?=?kCAFillModeForwards;

????anim.duration?=?2.0;


CGMutablePathRef?path?=?CGPathCreateMutable();

//繞著一個圓走

????CGPathAddEllipseInRect(path,?NULL,?CGRectMake(100,?100,?200,?200));

????anim.path?=?path;

????CGPathRelease(path);


????//?設(shè)置動畫的執(zhí)行節(jié)奏

????//?kCAMediaTimingFunctionEaseInEaseOut?:?一開始比較慢,?中間會加速,??臨近結(jié)束的時候,?會變慢

????anim.timingFunction?=?[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseInEaseOut];

????anim.delegate?=?self;//不用遵守協(xié)議就可設(shè)置代理


[self.redView.layer?addAnimation:anim?forKey:nil];

動畫代理方法:

//動畫開始的時候調(diào)用

-?(void)animationDidStart:(CAAnimation?*)anim;

//動畫結(jié)束的時候調(diào)用

-?(void)animationDidStop:(CAAnimation?*)anim?finished:(BOOL)flag;

6饵蒂、CAAnimationGroup

CAAnimation的子類声诸,可以保存一組動畫對象,將CAAnimationGroup對象加入層后退盯,組中所有動畫對象可以同時并發(fā)運行。

屬性解析:

animations:用來保存一組動畫對象的NSArray

默認情況下泻肯,一組動畫對象是同時運行的渊迁,也可以通過設(shè)置動畫對象的beginTime屬性來更改動畫的開始時間

例如:

Objective-C

-?(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event

{

????//?1.創(chuàng)建旋轉(zhuǎn)動畫對象

????CABasicAnimation?*rotate?=?[CABasicAnimation?animation];

????rotate.keyPath?=?@"transform.rotation";

????rotate.toValue?=?@(M_PI);


????//?2.創(chuàng)建縮放動畫對象

????CABasicAnimation?*scale?=?[CABasicAnimation?animation];

????scale.keyPath?=?@"transform.scale";

????scale.toValue?=?@(0.0);


????//?3.平移動畫

????CABasicAnimation?*move?=?[CABasicAnimation?animation];

????move.keyPath?=?@"transform.translation";

????move.toValue?=?[NSValue?valueWithCGPoint:CGPointMake(100,?100)];


????//?4.將所有的動畫添加到動畫組中

????CAAnimationGroup?*group?=?[CAAnimationGroup?animation];

????group.animations?=?@[rotate,?scale,?move];

group.duration?=?2.0;

//不恢復(fù)到最初狀態(tài)

????group.removedOnCompletion?=?NO;

????group.fillMode?=?kCAFillModeForwards;


????[self.myvie.layer?addAnimation:group?forKey:nil];

}

7CATransition

CAAnimation的子類灶挟,用于做轉(zhuǎn)場動畫琉朽,比如翻書動畫。它能夠為層提供移出屏幕和移入屏幕的動畫效果稚铣。iOS比Mac OS X的轉(zhuǎn)場動畫效果少一點箱叁。

UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果。

屬性解析:

type:動畫過渡類型

subtype:動畫過渡方向

startProgress:動畫起點(在整體動畫的百分比)

endProgress:動畫終點(在整體動畫的百分比)

/*?過渡效果

fade?????//交叉淡化過渡(不支持過渡方向) kCATransitionFade

push?????//新視圖把舊視圖推出去? kCATransitionPush

moveIn???//新視圖移到舊視圖上面?? kCATransitionMoveIn

reveal???//將舊視圖移開,顯示下面的新視圖? kCATransitionReveal

cube?????//立方體翻滾效果

oglFlip??//上下左右翻轉(zhuǎn)效果

suckEffect???//收縮效果惕医,如一塊布被抽走(不支持過渡方向)

rippleEffect?//滴水效果(不支持過渡方向)

pageCurl?????//向上翻頁效果

pageUnCurl???//向下翻頁效果

cameraIrisHollowOpen??//相機鏡頭打開效果(不支持過渡方向)

cameraIrisHollowClose?//相機鏡頭關(guān)上效果(不支持過渡方向)

*/

/*?過渡方向

kCATransitionFromRight

kCATransitionFromLeft

kCATransitionFromBottom

kCATransitionFromTop*/

CATransition的使用(示例代碼):

Objective-C

CATransition?*anim?=?[CATransition?animation];

anim.type?=?@“cube”;?//?動畫過渡類型

anim.subtype?=?kCATransitionFromTop;?//?動畫過渡方向

anim.duration?=?1;?//?動畫持續(xù)1s

//?代理耕漱,動畫執(zhí)行完畢后會調(diào)用delegate的animationDidStop:finished:

anim.delegate?=?self;

//中間穿插改變layer屬性的代碼

[layer?addAnimation:anim?forKey:nil];

8UIView動畫

UIKit直接將動畫集成到UIView類中抬伺,當內(nèi)部的一些屬性發(fā)生改變時螟够,UIView將為這些改變提供動畫支持。

執(zhí)行動畫所需要的工作由UIView類自動完成,但仍要在希望執(zhí)行動畫時通知視圖妓笙,為此需要將改變屬性的代碼放在[UIViewbeginAnimations:nilcontext:nil]和[UIViewcommitAnimations]之間若河。

例如:

Objective-C

[UIView?beginAnimations:nil?context:nil];

????//?動畫執(zhí)行完畢后,?會自動調(diào)用self的animateStop方法

????[UIView?setAnimationDelegate:self];

????[UIView?setAnimationDidStopSelector:@selector(animateStop)];

????self.myview.center?=?CGPointMake(200,?300);

[UIView?commitAnimations];

上述動畫效果等效于:

Objective-C

[UIView?animateWithDuration:1.0?animations:^{

????????self.myview.center?=?CGPointMake(200,?300);

????}?completion:^(BOOL?finished)?{


????}];

常見方法解析:

+ (void)setAnimationDelegate:(id)delegate。

設(shè)置動畫代理對象寞宫,當動畫開始或者結(jié)束時會發(fā)消息給代理對象

+ (void)setAnimationWillStartSelector:(SEL)selector萧福。

當動畫即將開始時,執(zhí)行delegate對象的selector辈赋,并且把beginAnimations:context:中傳入的參數(shù)傳進selector鲫忍。

+ (void)setAnimationDidStopSelector:(SEL)selector。

當動畫結(jié)束時炭庙,執(zhí)行delegate對象的selector饲窿,并且把beginAnimations:context:中傳入的參數(shù)傳進selector。

例如:

Objective-C

//?說明需要執(zhí)行動畫

[UIView?beginAnimations:nil?context:nil];

//?設(shè)置動畫持續(xù)事件

[UIView?setAnimationDuration:1];

//?設(shè)置轉(zhuǎn)場動畫

[UIView?setAnimationTransition:UIViewAnimationTransitionCurlUp?forView:self.view?cache:YES];

//?交換子視圖的位置

[self.view?exchangeSubviewAtIndex:0?withSubviewAtIndex:1];

//?提交動畫

[UIView?commitAnimations];

+ (void)setAnimationDuration:(NSTimeInterval)duration

動畫的持續(xù)時間焕蹄,秒為單位

+ (void)setAnimationDelay:(NSTimeInterval)delay

動畫延遲delay秒后再開始

+ (void)setAnimationStartDate:(NSDate *)startDate

動畫的開始時間逾雄,默認為now

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve

動畫的節(jié)奏控制,具體看下面的”備注”

+ (void)setAnimationRepeatCount:(float)repeatCount

動畫的重復(fù)次數(shù)

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses

如果設(shè)置為YES,代表動畫每次重復(fù)執(zhí)行的效果會跟上一次相反项玛。

【備注】動畫的節(jié)奏控制斤彼,跟CAAnimation的timingFunction屬性類似

Objective-C

typedef?NS_ENUM(NSInteger,?UIViewAnimationCurve)?{

????UIViewAnimationCurveEaseInOut,?//?slow?at?beginning?and?end

????UIViewAnimationCurveEaseIn,??//?slow?at?beginning

????UIViewAnimationCurveEaseOut,?//?slow?at?end

????UIViewAnimationCurveLinear

};

+ (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)viewcache:(BOOL)cache

設(shè)置視圖view的過渡效果, transition指定過渡類型, cache設(shè)置YES代表使用視圖緩存,性能較好

【備注】

Objective-C

typedef?NS_ENUM(NSInteger,?UIViewAnimationTransition)?{

????UIViewAnimationTransitionNone,

????UIViewAnimationTransitionFlipFromLeft,

????UIViewAnimationTransitionFlipFromRight,

????UIViewAnimationTransitionCurlUp,

????UIViewAnimationTransitionCurlDown,

};

9肉瓦、Block動畫

+ (void)animateWithDuration:(NSTimeInterval)durationdelay:

(NSTimeInterval)delayoptions:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animationscompletion:(void (^)(BOOL finished))completion

參數(shù)解析:

duration:動畫的持續(xù)時間

delay:動畫延遲delay秒后開始

options:動畫的節(jié)奏控制

animations:將改變視圖屬性的代碼放在這個block中

completion:動畫結(jié)束后永品,會自動調(diào)用這個block

【備注】動畫的節(jié)奏控制枚舉常量

UIViewAnimationOptionCurveEaseInOut

UIViewAnimationOptionCurveEaseIn

UIViewAnimationOptionCurveEaseOut

UIViewAnimationOptionCurveLinear

+ (void)transitionWithView:(UIView *)viewduration:

(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionsanimations:(void (^)(void))animationscompletion:(void (^)(BOOL finished))completion

參數(shù)解析:

duration:動畫的持續(xù)時間

view:需要進行轉(zhuǎn)場動畫的視圖

options:轉(zhuǎn)場動畫的類型

animations:將改變視圖屬性的代碼放在這個block中

completion:動畫結(jié)束后做鹰,會自動調(diào)用這個block

【備注】轉(zhuǎn)場動畫的類型

UIViewAnimationOptionTransitionNone

UIViewAnimationOptionTransitionFlipFromLeft

UIViewAnimationOptionTransitionFlipFromRight

UIViewAnimationOptionTransitionCurlUp

UIViewAnimationOptionTransitionCurlDown

UIViewAnimationOptionTransitionCrossDissolve

UIViewAnimationOptionTransitionFlipFromTop

UIViewAnimationOptionTransitionFlipFromBottom

例如:

Objective-C

-?(void)touchesBegan:(NSSet?*)touches?withEvent:(UIEvent?*)event

{

????self.index++;

????if?(self.index?==?3)?{

????????self.index?=?0;

????}


????NSString?*filename?=?[NSString?stringWithFormat:@"%d.jpg",?self.index?+?1];

????self.iconView.image?=?[UIImage?imageNamed:filename];

[UIView?transitionWithView:self.view?duration:1.0?options:UIViewAnimationOptionTransitionFlipFromTop?animations:nil?completion:nil];


}

+ (void)transitionFromView:(UIView *)fromViewtoView:(UIView *)toViewduration:(NSTimeInterval)durationoptions:(UIViewAnimationOptions)optionscompletion:(void (^)(BOOL finished))completion

方法調(diào)用完畢后,相當于執(zhí)行了下面兩句代碼:

// 添加toView到父視圖

[fromView.superview addSubview:toView];

// 把fromView從父視圖中移除

[fromView.superview removeFromSuperview];

參數(shù)解析:

duration:動畫的持續(xù)時間

options:轉(zhuǎn)場動畫的類型

animations:將改變視圖屬性的代碼放在這個block中

completion:動畫結(jié)束后鼎姐,會自動調(diào)用這個block

10钾麸、UIImageView的幀動畫

UIImageView可以讓一系列的圖片在特定的時間內(nèi)按順序顯示。

相關(guān)屬性解析:

animationImages:要顯示的圖片(一個裝著UIImage的NSArray)

animationDuration:完整地顯示一次animationImages中的所有圖片所需的時間

animationRepeatCount:動畫的執(zhí)行次數(shù)(默認為0炕桨,代表無限循環(huán))

相關(guān)方法解析:

– (void)startAnimating; 開始動畫

– (void)stopAnimating;? 停止動畫

– (BOOL)isAnimating;? 是否正在運行動畫

11饭尝、UIActivityIndicatorView

是一個旋轉(zhuǎn)進度輪,可以用來告知用戶有一個操作正在進行中献宫,一般用initWithActivityIndicatorStyle初始化钥平。

方法解析:

– (void)startAnimating; 開始動畫

– (void)stopAnimating;? 停止動畫

– (BOOL)isAnimating;? 是否正在運行動畫

UIActivityIndicatorViewStyle3個值可供選擇:

UIActivityIndicatorViewStyleWhiteLarge???//大型白色指示器

UIActivityIndicatorViewStyleWhite??????//標準尺寸白色指示器

UIActivityIndicatorViewStyleGray????//灰色指示器,用于白色背景

原創(chuàng)文章姊途,轉(zhuǎn)載請注明:?轉(zhuǎn)載自李峰峰博客

本文鏈接地址:?iOS開發(fā)之核心動畫(Core Animation)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涉瘾,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子捷兰,更是在濱河造成了極大的恐慌立叛,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寂殉,死亡現(xiàn)場離奇詭異囚巴,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門彤叉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來庶柿,“玉大人,你說我怎么就攤上這事秽浇「÷” “怎么了?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵柬焕,是天一觀的道長审残。 經(jīng)常有香客問我,道長斑举,這世上最難降的妖魔是什么搅轿? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮富玷,結(jié)果婚禮上璧坟,老公的妹妹穿的比我還像新娘。我一直安慰自己赎懦,他們只是感情好雀鹃,可當我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著励两,像睡著了一般黎茎。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上当悔,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天傅瞻,我揣著相機與錄音,去河邊找鬼盲憎。 笑死俭正,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的焙畔。 我是一名探鬼主播,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼串远,長吁一口氣:“原來是場噩夢啊……” “哼宏多!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起澡罚,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤伸但,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后留搔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體更胖,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了却妨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片饵逐。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖彪标,靈堂內(nèi)的尸體忽然破棺而出倍权,到底是詐尸還是另有隱情,我是刑警寧澤捞烟,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布薄声,位于F島的核電站,受9級特大地震影響题画,放射性物質(zhì)發(fā)生泄漏默辨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一苍息、第九天 我趴在偏房一處隱蔽的房頂上張望缩幸。 院中可真熱鬧,春花似錦档叔、人聲如沸桌粉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽铃肯。三九已至,卻和暖如春传蹈,著一層夾襖步出監(jiān)牢的瞬間押逼,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工惦界, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留挑格,地道東北人。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓沾歪,卻偏偏與公主長得像漂彤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子灾搏,可洞房花燭夜當晚...
    茶點故事閱讀 43,562評論 2 349

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

  • 在iOS中隨處都可以看到絢麗的動畫效果挫望,實現(xiàn)這些動畫的過程并不復(fù)雜,今天將帶大家一窺ios動畫全貌狂窑。在這里你可以看...
    每天刷兩次牙閱讀 8,471評論 6 30
  • 如果想讓事情變得順利媳板,只有靠自己--夏爾·紀堯姆 上一章介紹了隱式動畫的概念。隱式動畫是在iOS平臺創(chuàng)建動態(tài)用戶界...
    夜空下最亮的亮點閱讀 1,933評論 0 1
  • 1 CALayer IOS SDK詳解之CALayer(一) http://doc.okbase.net/Hell...
    Kevin_Junbaozi閱讀 5,133評論 3 23
  • 在iOS實際開發(fā)中常用的動畫無非是以下四種:UIView動畫泉哈,核心動畫蛉幸,幀動畫破讨,自定義轉(zhuǎn)場動畫。 1.UIView...
    請叫我周小帥閱讀 3,082評論 1 23
  • 在iOS中隨處都可以看到絢麗的動畫效果奕纫,實現(xiàn)這些動畫的過程并不復(fù)雜提陶,今天將帶大家一窺iOS動畫全貌。在這里你可以看...
    F麥子閱讀 5,104評論 5 13