30多種iOS常用動畫

轉自:http://blog.csdn.net/zhibudefeng/article/details/8691567

//??

//??CoreAnimationEffect.h??

//??CoreAnimationEffect??

//??

//??Created?by?VincentXue?on?13-1-19.??

//??Copyright?(c)?2013年?VincentXue.?All?rights?reserved.??

//??


#import???


/**

?!??導入QuartzCore.framework

?*

?*??Example:

?*

?*??Step.1

?*

?*??????#import?"CoreAnimationEffect.h"

?*

?*??Step.2

?*

?*??????[CoreAnimationEffect?animationMoveLeft:your?view];

?*??

?*/??



@interface?CoreAnimationEffect?:?NSObject??


#pragma?mark?-?Custom?Animation??


/**

?*???@brief?快速構建一個你自定義的動畫,有以下參數供你設置.

?*

?*???@note??調用系統預置Type需要在調用類引入下句

?*

?*??????????#import?

?*

?*???@param?type????????????????動畫過渡類型

?*???@param?subType?????????????動畫過渡方向(子類型)

?*???@param?duration????????????動畫持續時間

?*???@param?timingFunction??????動畫定時函數屬性

?*???@param?theView?????????????需要添加動畫的view.

?*

?*

?*/??


+?(void)showAnimationType:(NSString?*)type??

?withSubType:(NSString?*)subType??

?duration:(CFTimeInterval)duration??

?timingFunction:(NSString?*)timingFunction??

?view:(UIView?*)theView;??


#pragma?mark?-?Preset?Animation??


/**

?*??下面是一些常用的動畫效果

?*/??


//?reveal??

+?(void)animationRevealFromBottom:(UIView?*)view;??

+?(void)animationRevealFromTop:(UIView?*)view;??

+?(void)animationRevealFromLeft:(UIView?*)view;??

+?(void)animationRevealFromRight:(UIView?*)view;??


//?漸隱漸消??

+?(void)animationEaseIn:(UIView?*)view;??

+?(void)animationEaseOut:(UIView?*)view;??


//?翻轉??

+?(void)animationFlipFromLeft:(UIView?*)view;??

+?(void)animationFlipFromRigh:(UIView?*)view;??


//?翻頁??

+?(void)animationCurlUp:(UIView?*)view;??

+?(void)animationCurlDown:(UIView?*)view;??


//?push??

+?(void)animationPushUp:(UIView?*)view;??

+?(void)animationPushDown:(UIView?*)view;??

+?(void)animationPushLeft:(UIView?*)view;??

+?(void)animationPushRight:(UIView?*)view;??


//?move??

+?(void)animationMoveUp:(UIView?*)view?duration:(CFTimeInterval)duration;??

+?(void)animationMoveDown:(UIView?*)view?duration:(CFTimeInterval)duration;??

+?(void)animationMoveLeft:(UIView?*)view;??

+?(void)animationMoveRight:(UIView?*)view;??


//?旋轉縮放??


//?各種旋轉縮放效果??

+?(void)animationRotateAndScaleEffects:(UIView?*)view;??


//?旋轉同時縮小放大效果??

+?(void)animationRotateAndScaleDownUp:(UIView?*)view;??




#pragma?mark?-?Private?API??


/**

?*??下面動畫里用到的某些屬性在當前API里是不合法的,但是也可以用.

?*/??


+?(void)animationFlipFromTop:(UIView?*)view;??

+?(void)animationFlipFromBottom:(UIView?*)view;??


+?(void)animationCubeFromLeft:(UIView?*)view;??

+?(void)animationCubeFromRight:(UIView?*)view;??

+?(void)animationCubeFromTop:(UIView?*)view;??

+?(void)animationCubeFromBottom:(UIView?*)view;??


+?(void)animationSuckEffect:(UIView?*)view;??


+?(void)animationRippleEffect:(UIView?*)view;??


+?(void)animationCameraOpen:(UIView?*)view;??

+?(void)animationCameraClose:(UIView?*)view;??


@end??




//??

//??CoreAnimationEffect.m??

//??CoreAnimationEffect??

//??

//??Created?by?VincentXue?on?13-1-19.??

//??Copyright?(c)?2013年?VincentXue.?All?rights?reserved.??

//??


#import?"CoreAnimationEffect.h"??


#import???


@implementation?CoreAnimationEffect??


/**

?*??首先推薦一個不錯的網站.???http://www.raywenderlich.com

?*/??


#pragma?mark?-?Custom?Animation??


+?(void)showAnimationType:(NSString?*)type??

?withSubType:(NSString?*)subType??

?duration:(CFTimeInterval)duration??

?timingFunction:(NSString?*)timingFunction??

?view:(UIView?*)theView??

{??

/**?CATransition

?????*

?????*??@see?http://www.dreamingwish.com/dream-2012/the-concept-of-coreanimation-programming-guide.html

?????*??@see?http://geeklu.com/2012/09/animation-in-ios/

?????*

?????*??CATransition?常用設置及屬性注解如下:

?????*/??


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


/**?delegate

?????*

?????*??動畫的代理,如果你想在動畫開始和結束的時候做一些事,可以設置此屬性,它會自動回調兩個代理方法.

?????*

?????*??@see?CAAnimationDelegate????(按下command鍵點擊)

?????*/??


animation.delegate?=?self;??


/**?duration

?????*

?????*??動畫持續時間

?????*/??


animation.duration?=?duration;??


/**?timingFunction

?????*

?????*??用于變化起點和終點之間的插值計算,形象點說它決定了動畫運行的節奏,比如是均勻變化(相同時間變化量相同)還是

?????*??先快后慢,先慢后快還是先慢再快再慢.

?????*

?????*??動畫的開始與結束的快慢,有五個預置分別為(下同):

?????*??kCAMediaTimingFunctionLinear????????????線性,即勻速

?????*??kCAMediaTimingFunctionEaseIn????????????先慢后快

?????*??kCAMediaTimingFunctionEaseOut???????????先快后慢

?????*??kCAMediaTimingFunctionEaseInEaseOut?????先慢后快再慢

?????*??kCAMediaTimingFunctionDefault???????????實際效果是動畫中間比較快.

?????*/??


/**?timingFunction

?????*

?????*??當上面的預置不能滿足你的需求的時候,你可以使用下面的兩個方法來自定義你的timingFunction

?????*??具體參見下面的URL

?????*

?????*??@see?http://developer.apple.com/library/ios/#documentation/Cocoa/Reference/CAMediaTimingFunction_class/Introduction/Introduction.html

?????*

?????*??+?(id)functionWithControlPoints:(float)c1x?:(float)c1y?:(float)c2x?:(float)c2y;

?????*

?????*??-?(id)initWithControlPoints:(float)c1x?:(float)c1y?:(float)c2x?:(float)c2y;

?????*/??


animation.timingFunction?=?[CAMediaTimingFunction?functionWithName:timingFunction];??


/**?fillMode

?????*

?????*??決定當前對象過了非active時間段的行為,比如動畫開始之前,動畫結束之后.

?????*??預置為:

?????*??kCAFillModeRemoved???默認,當動畫開始前和動畫結束后,動畫對layer都沒有影響,動畫結束后,layer會恢復到之前的狀態

?????*??kCAFillModeForwards??當動畫結束后,layer會一直保持著動畫最后的狀態

?????*??kCAFillModeBackwards?和kCAFillModeForwards相對,具體參考上面的URL

?????*??kCAFillModeBoth??????kCAFillModeForwards和kCAFillModeBackwards在一起的效果

?????*/??


animation.fillMode?=?kCAFillModeForwards;??


/**?removedOnCompletion

?????*

?????*??這個屬性默認為YES.一般情況下,不需要設置這個屬性.

?????*

?????*??但如果是CAAnimation動畫,并且需要設置?fillMode?屬性,那么需要將?removedOnCompletion?設置為NO,否則

?????*??fillMode無效

?????*/??


//????animation.removedOnCompletion?=?NO;??


/**?type

?????*

?????*??各種動畫效果??其中除了'fade',?`moveIn',?`push'?,?`reveal'?,其他屬于似有的API(我是這么認為的,可以點進去看下注釋).

?????*??↑↑↑上面四個可以分別使用'kCATransitionFade',?'kCATransitionMoveIn',?'kCATransitionPush',?'kCATransitionReveal'來調用.

?????*??@"cube"?????????????????????立方體翻滾效果

?????*??@"moveIn"???????????????????新視圖移到舊視圖上面

?????*??@"reveal"???????????????????顯露效果(將舊視圖移開,顯示下面的新視圖)

?????*??@"fade"?????????????????????交叉淡化過渡(不支持過渡方向)?????????????(默認為此效果)

?????*??@"pageCurl"?????????????????向上翻一頁

?????*??@"pageUnCurl"???????????????向下翻一頁

?????*??@"suckEffect"???????????????收縮效果,類似系統最小化窗口時的神奇效果(不支持過渡方向)

?????*??@"rippleEffect"?????????????滴水效果,(不支持過渡方向)

?????*??@"oglFlip"??????????????????上下左右翻轉效果

?????*??@"rotate"???????????????????旋轉效果

?????*??@"push"?????????????????????

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

?????*??@"cameraIrisHollowClose"????相機鏡頭關上效果(不支持過渡方向)

?????*/??


/**?type

?????*

?????*??kCATransitionFade????????????交叉淡化過渡

?????*??kCATransitionMoveIn??????????新視圖移到舊視圖上面

?????*??kCATransitionPush????????????新視圖把舊視圖推出去

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

?????*/??


animation.type?=?type;??


/**?subtype

?????*

?????*??各種動畫方向

?????*

?????*??kCATransitionFromRight;??????同字面意思(下同)

?????*??kCATransitionFromLeft;

?????*??kCATransitionFromTop;

?????*??kCATransitionFromBottom;

?????*/??


/**?subtype

?????*

?????*??當type為@"rotate"(旋轉)的時候,它也有幾個對應的subtype,分別為:

?????*??90cw????逆時針旋轉90°

?????*??90ccw???順時針旋轉90°

?????*??180cw???逆時針旋轉180°

?????*??180ccw??順時針旋轉180°

?????*/??


/**

?????*??type與subtype的對應關系(必看),如果對應錯誤,動畫不會顯現.

?????*

?????*??@see?http://iphonedevwiki.net/index.php/CATransition

?????*/??


animation.subtype?=?subType;??


/**

?????*??所有核心動畫和特效都是基于CAAnimation,而CAAnimation是作用于CALayer的.所以把動畫添加到layer上.

?????*??forKey??可以是任意字符串.

?????*/??


[theView.layer?addAnimation:animation?forKey:nil];??

}??


#pragma?mark?-?Preset?Animation??



+?(void)animationRevealFromBottom:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionReveal];??

[animation?setSubtype:kCATransitionFromBottom];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseIn]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationRevealFromTop:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionReveal];??

[animation?setSubtype:kCATransitionFromTop];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationRevealFromLeft:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionReveal];??

[animation?setSubtype:kCATransitionFromLeft];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationRevealFromRight:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionReveal];??

[animation?setSubtype:kCATransitionFromRight];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??



+?(void)animationEaseIn:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionFade];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseIn]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationEaseOut:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setType:kCATransitionFade];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??


[view.layer?addAnimation:animation?forKey:nil];??

}??



/**

?*??UIViewAnimation

?*

?*??@see????http://www.cocoachina.com/bbs/read.php?tid=110168

?*

?*??@brief??UIView動畫應該是最簡單便捷創建動畫的方式了,詳解請猛戳URL.

?*??

?*??@method?beginAnimations:context?第一個參數用來作為動畫的標識,第二個參數給代理代理傳遞消息.至于為什么一個使用

?*??????????????????????????????????nil而另外一個使用NULL,是因為第一個參數是一個對象指針,而第二個參數是基本數據類型.

?*??@method?setAnimationCurve:??????設置動畫的加速或減速的方式(速度)

?*??@method?setAnimationDuration:???動畫持續時間

?*??@method?setAnimationTransition:forView:cache:???第一個參數定義動畫類型,第二個參數是當前視圖對象,第三個參數是是否使用緩沖區

?*??@method?commitAnimations????????動畫結束

?*/??


+?(void)animationFlipFromLeft:(UIView?*)view??

{??

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

[UIView?setAnimationCurve:UIViewAnimationCurveEaseInOut];??

[UIView?setAnimationDuration:0.35f];??

[UIView?setAnimationTransition:UIViewAnimationTransitionFlipFromLeft?forView:view?cache:NO];??

[UIView?commitAnimations];??

}??


+?(void)animationFlipFromRigh:(UIView?*)view??

{??

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

[UIView?setAnimationCurve:UIViewAnimationCurveEaseInOut];??

[UIView?setAnimationDuration:0.35f];??

[UIView?setAnimationTransition:UIViewAnimationTransitionFlipFromRight?forView:view?cache:NO];??

[UIView?commitAnimations];??

}??



+?(void)animationCurlUp:(UIView?*)view??

{??

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

[UIView?setAnimationCurve:UIViewAnimationCurveEaseOut];??

[UIView?setAnimationDuration:0.35f];??

[UIView?setAnimationTransition:UIViewAnimationTransitionCurlUp?forView:view?cache:NO];??

[UIView?commitAnimations];??

}??


+?(void)animationCurlDown:(UIView?*)view??

{??

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

[UIView?setAnimationCurve:UIViewAnimationCurveEaseIn];??

[UIView?setAnimationDuration:0.35f];??

[UIView?setAnimationTransition:UIViewAnimationTransitionCurlDown?forView:view?cache:NO];??

[UIView?commitAnimations];??

}??


+?(void)animationPushUp:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionPush];??

[animation?setSubtype:kCATransitionFromTop];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationPushDown:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionPush];??

[animation?setSubtype:kCATransitionFromBottom];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationPushLeft:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionPush];??

[animation?setSubtype:kCATransitionFromLeft];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationPushRight:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionPush];??

[animation?setSubtype:kCATransitionFromRight];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


//?presentModalViewController??

+?(void)animationMoveUp:(UIView?*)view?duration:(CFTimeInterval)duration??

{??

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

[animation?setDuration:duration];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];??

[animation?setType:kCATransitionMoveIn];??

[animation?setSubtype:kCATransitionFromTop];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


//?dissModalViewController??

+?(void)animationMoveDown:(UIView?*)view?duration:(CFTimeInterval)duration??

{??

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

transition.duration?=0.4;??

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

transition.type?=?kCATransitionReveal;??

transition.subtype?=?kCATransitionFromBottom;??

[view.layer?addAnimation:transition?forKey:nil];??

}??


+?(void)animationMoveLeft:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionMoveIn];??

[animation?setSubtype:kCATransitionFromLeft];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationMoveRight:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:kCATransitionMoveIn];??

[animation?setSubtype:kCATransitionFromRight];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+(void)animationRotateAndScaleEffects:(UIView?*)view??

{??

[UIView?animateWithDuration:0.35f?animations:^??

?????{??

/**

??????????*??@see???????http://donbe.blog.163.com/blog/static/138048021201061054243442/

??????????*

??????????*??@param?????transform???形變屬性(結構體),可以利用這個屬性去對view做一些翻轉或者縮放.詳解請猛戳↑URL.

??????????*

??????????*??@method????valueWithCATransform3D:?此方法需要一個CATransform3D的結構體.一些非詳細的講解可以看下面的URL

??????????*

??????????*??@see???????http://blog.csdn.net/liubo0_0/article/details/7452166

??????????*

??????????*/??


view.transform?=?CGAffineTransformMakeScale(0.001,?0.001);??


CABasicAnimation?*animation?=?[CABasicAnimation?animationWithKeyPath:@"transform"];??


//?向右旋轉45°縮小到最小,然后再從小到大推出.??

animation.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI,?0.70,?0.40,?0.80)];??


/**

??????????*?????其他效果:

??????????*?????從底部向上收縮一半后彈出

??????????*?????animation.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI,?0.0,?1.0,?0.0)];

??????????*

??????????*?????從底部向上完全收縮后彈出

??????????*?????animation.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI,?1.0,?0.0,?0.0)];

??????????*

??????????*?????左旋轉45°縮小到最小,然后再從小到大推出.

??????????*?????animation.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI,?0.50,?-0.50,?0.50)];

??????????*

??????????*?????旋轉180°縮小到最小,然后再從小到大推出.

??????????*?????animation.toValue?=?[NSValue?valueWithCATransform3D:CATransform3DMakeRotation(M_PI,?0.1,?0.2,?0.2)];

??????????*/??


animation.duration?=?0.45;??

animation.repeatCount?=?1;??

[view.layer?addAnimation:animation?forKey:nil];??


?????}??

?completion:^(BOOL?finished)??

?????{??

[UIView?animateWithDuration:0.35f?animations:^??

??????????{??

view.transform?=?CGAffineTransformMakeScale(1.0,?1.0);??

??????????}];??

?????}];??

}??


/**?CABasicAnimation

?*

?*??@see?https://developer.apple.com/library/mac/#documentation/cocoa/conceptual/CoreAnimation_guide/Articles/KVCAdditions.html

?*

?*??@brief??????????????????????便利構造函數?animationWithKeyPath:?KeyPath需要一個字符串類型的參數,實際上是一個

?*??????????????????????????????鍵-值編碼協議的擴展,參數必須是CALayer的某一項屬性,你的代碼會對應的去改變該屬性的效果

?*??????????????????????????????具體可以填寫什么請參考上面的URL,切勿亂填!

?*??????????????????????????????例如這里填寫的是?@"transform.rotation.z"?意思就是圍繞z軸旋轉,旋轉的單位是弧度.

?*??????????????????????????????這個動畫的效果是把view旋轉到最小,再旋轉回來.

?*??????????????????????????????你也可以填寫@"opacity"?去修改透明度...以此類推.修改layer的屬性,可以用這個類.

?*

?*??@param?toValue??????????????動畫結束的值.CABasicAnimation自己只有三個屬性(都很重要)(其他屬性是繼承來的),分別為:

?*??????????????????????????????fromValue(開始值),?toValue(結束值),?byValue(偏移值),

?!??????????????????????????????這三個屬性最多只能同時設置兩個;

?*??????????????????????????????他們之間的關系如下:

?*??????????????????????????????如果同時設置了fromValue和toValue,那么動畫就會從fromValue過渡到toValue;

?*??????????????????????????????如果同時設置了fromValue和byValue,那么動畫就會從fromValue過渡到fromValue?+?byValue;

?*??????????????????????????????如果同時設置了byValue??和toValue,那么動畫就會從toValue?-?byValue過渡到toValue;

?*

?*??????????????????????????????如果只設置了fromValue,那么動畫就會從fromValue過渡到當前的value;

?*??????????????????????????????如果只設置了toValue??,那么動畫就會從當前的value過渡到toValue;

?*??????????????????????????????如果只設置了byValue??,那么動畫就會從從當前的value過渡到當前value?+?byValue.

?*

?*??????????????????????????????可以這么理解,當你設置了三個中的一個或多個,系統就會根據以上規則使用插值算法計算出一個時間差并

?*??????????????????????????????同時開啟一個Timer.Timer的間隔也就是這個時間差,通過這個Timer去不停地刷新keyPath的值.

?!??????????????????????????????而實際上,keyPath的值(layer的屬性)在動畫運行這一過程中,是沒有任何變化的,它只是調用了GPU去

?*??????????????????????????????完成這些顯示效果而已.

?*??????????????????????????????在這個動畫里,是設置了要旋轉到的弧度,根據以上規則,動畫將會從它當前的弧度專旋轉到我設置的弧度.

?*

?*??@param?duration?????????????動畫持續時間

?*

?*??@param?timingFunction???????動畫起點和終點之間的插值計算,也就是說它決定了動畫運行的節奏,是快還是慢,還是先快后慢...

?*/??


/**?CAAnimationGroup

?*

?*??@brief??????????????????????顧名思義,這是一個動畫組,它允許多個動畫組合在一起并行顯示.比如這里設置了兩個動畫,

?*??????????????????????????????把他們加在動畫組里,一起顯示.例如你有幾個動畫,在動畫執行的過程中需要同時修改動畫的某些屬性,

?*??????????????????????????????這時候就可以使用CAAnimationGroup.

?*

?*??@param?duration?????????????動畫持續時間,值得一提的是,如果添加到group里的子動畫不設置此屬性,group里的duration會統一

?*??????????????????????????????設置動畫(包括子動畫)的duration屬性;但是如果子動畫設置了duration屬性,那么group的duration屬性

?*??????????????????????????????的值不應該小于每個子動畫中duration屬性的值,否則會造成子動畫顯示不全就停止了動畫.

?*

?*??@param?autoreverses?????????動畫完成后自動重新開始,默認為NO.

?*

?*??@param?repeatCount??????????動畫重復次數,默認為0.

?*

?*??@param?animations???????????動畫組(數組類型),把需要同時運行的動畫加到這個數組里.

?*

?*??@note??addAnimation:forKey??這個方法的forKey參數是一個字符串,這個字符串可以隨意設置.

?*

?*??@note???????????????????????如果你需要在動畫group執行結束后保存動畫效果的話,設置?fillMode?屬性,并且把

?*??????????????????????????????removedOnCompletion?設置為NO;

?*/??


+?(void)animationRotateAndScaleDownUp:(UIView?*)view??

{??

CABasicAnimation?*rotationAnimation?=?[CABasicAnimation?animationWithKeyPath:@"transform.rotation.z"];??

rotationAnimation.toValue?=?[NSNumber?numberWithFloat:(22?*?M_PI)?*?2];??

rotationAnimation.duration?=?0.35f;??

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


CABasicAnimation?*scaleAnimation?=?[CABasicAnimation?animationWithKeyPath:@"transform.scale"];??

scaleAnimation.toValue?=?[NSNumber?numberWithFloat:0.0];??

scaleAnimation.duration?=?0.35f;??

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


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

animationGroup.duration?=?0.35f;??

animationGroup.autoreverses?=?YES;??

animationGroup.repeatCount?=?1;??

animationGroup.animations?=[NSArray?arrayWithObjects:rotationAnimation,?scaleAnimation,?nil?nil];??

[view.layer?addAnimation:animationGroup?forKey:@"animationGroup"];??

}??




#pragma?mark?-?Private?API??


+?(void)animationFlipFromTop:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"oglFlip"];??

[animation?setSubtype:@"fromTop"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationFlipFromBottom:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"oglFlip"];??

[animation?setSubtype:@"fromBottom"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCubeFromLeft:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cube"];??

[animation?setSubtype:@"fromLeft"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCubeFromRight:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cube"];??

[animation?setSubtype:@"fromRight"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCubeFromTop:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cube"];??

[animation?setSubtype:@"fromTop"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCubeFromBottom:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cube"];??

[animation?setSubtype:@"fromBottom"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationSuckEffect:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"suckEffect"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationRippleEffect:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"rippleEffect"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCameraOpen:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cameraIrisHollowOpen"];??

[animation?setSubtype:@"fromRight"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??


+?(void)animationCameraClose:(UIView?*)view??

{??

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

[animation?setDuration:0.35f];??

[animation?setFillMode:kCAFillModeForwards];??

[animation?setTimingFunction:[CAMediaTimingFunction?functionWithName:kCAMediaTimingFunctionEaseOut]];??

[animation?setType:@"cameraIrisHollowClose"];??

[animation?setSubtype:@"fromRight"];??


[view.layer?addAnimation:animation?forKey:nil];??

}??

@end??

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,156評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,401評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 176,069評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,873評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,635評論 6 408
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,128評論 1 323
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,203評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,365評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,881評論 1 334
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,733評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,935評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,475評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,172評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,582評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,821評論 1 282
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,595評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,908評論 2 372

推薦閱讀更多精彩內容