iOS開發常見的30多個動畫

jopen 10年前發布 | 26K 次閱讀 IOS iOS開發 移動開發

     //
// CoreAnimationEffect.h
// CoreAnimationEffect
//
// Created by summer on 14-09-22.
// Copyright (c) summer2014mht@sina.com. All rights reserved.
//

#import <Foundation/Foundation.h>  

/** 
 !  導入QuartzCore.framework 
 * 
 *  Example: 
 * 
 *  Step.1 
 * 
 *     #import <QuartzCore/QuartzCore.h> 
 * 
 *  Step.2 
 * 
 *      [CoreAnimationEffect animationMoveLeft:your view]; 
 *   
 */  


@interface CoreAnimationEffect : NSObject  

#pragma mark - Custom Animation  

/** 
 *   @brief 快速構建一個你自定義的動畫,有以下參數供你設置. 
 * 
 *   @note  調用系統預置Type需要在調用類引入下句 
 * 
 *          #import <QuartzCore/QuartzCore.h> 
 * 
 *   @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 14-09-22.  
//  Copyright (c) 2014年 summer2014mht@sina.com. All rights reserved.  
//  

#import "CoreAnimationEffect.h"  

#import <QuartzCore/QuartzCore.h>  

@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/Articl 

es/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:(2 * 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];  
 [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  </pre><br />
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!