iOS開發CAAnimation詳解


Core Animation,即為核心動畫,它是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果,而且往往是事半功倍。也就是說,使用少量的代碼就可以實現非常強大的功能。Core Animation可以用在Mac OS X和iOS平台。Core Animation的動畫執行過程都是在后台操作的,不會阻塞主線程。要注意的是,Core Animation是直接作用在CALayer上的,並非UIView。

1. 使用步驟

  1. 使用它需要先添加QuartzCore.framework框架和引入主頭文件<QuartzCore/QuartzCore.h>(iOS7不需要);
  2. 初始化一個CAAnimation對象,並設置一些動畫相關屬性;
  3. 通過調用CALayer的addAnimation:forKey:方法增加CAAnimation對象到CALayer中,這樣就能開始執行動畫了;
  4. 通過調用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫。

2. 結構

CAAnimation是所有動畫對象的父類,負責控制動畫的持續時間和速度,是個抽象類,不能直接使用,應該使用它具體的子類。屬性:

duration:動畫的持續時間
repeatCount:動畫的重復次數
repeatDuration:動畫的重復時間
removedOnCompletion:默認為YES,代表動畫執行完畢后就從圖層上移除,圖形會恢復到動畫執行前的狀態。如果想讓圖層保持顯示動畫執行后的狀態,那就設置為NO,不過還要設置fillMode為kCAFillModeForwards
fillMode:決定當前對象在非active時間段的行為。比如動畫開始之前,動畫結束之后
beginTime:可以用來設置動畫延遲執行時間,若想延遲2s,就設置為CACurrentMediaTime()+2,CACurrentMediaTime()為圖層的當前時間
timingFunction:速度控制函數,控制動畫運行的節奏
delegate:動畫代理

image

3. 子類

  1. CAPropertyAnimation,是CAAnimation的子類,也是個抽象類,要想創建動畫對象,應該使用它的兩個子類:CABasicAnimation和CAKeyframeAnimation。

    屬性解析:

    1. keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型),並且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。比如,指定@”position”為keyPath,就修改CALayer的position屬性的值,以達到平移的動畫效果。
  2. CABasicAnimation

    屬性解析:

    1. fromValue:keyPath相應屬性的初始值。
    2. toValue:keyPath相應屬性的結束值。
    3. 隨着動畫的進行,在長度為duration的持續時間內,keyPath相應屬性的值從fromValue漸漸地變為toValue。
    4. 如果fillMode=kCAFillModeForwards和removedOnComletion=NO,那么在動畫執行完畢后,圖層會保持顯示動畫執行后的狀態。但在實質上,圖層的屬性值還是動畫執行前的初始值,並沒有真正被改變。比如,CALayer的position初始值為(0,0),CABasicAnimation的fromValue為(10,10),toValue為(100,100),雖然動畫執行完畢后圖層保持在(100,100)這個位置,實質上圖層的position還是為(0,0)。
  3. CAKeyframeAnimation,CApropertyAnimation的子類,跟CABasicAnimation的區別是:CABasicAnimation只能從一個數值(fromValue)變到另一個數值(toValue),而CAKeyframeAnimation會使用一個NSArray保存這些數值。

    屬性解析:

    1. values:就是上述的NSArray對象。里面的元素稱為”關鍵幀”(keyframe)。動畫對象會在指定的時間(duration)內,依次顯示values數組中的每一個關鍵幀。
    2. path:可以設置一個CGPathRef\CGMutablePathRef,讓層跟着路徑移動。path只對CALayer的anchorPoint和position起作用。如果你設置了path,那么values將被忽略。
    3. keyTimes:可以為對應的關鍵幀指定對應的時間點,其取值范圍為0到1.0,keyTimes中的每一個時間值都對應values中的每一幀.當keyTimes沒有設置的時候,各個關鍵幀的時間是平分的。
    4. CABasicAnimation可看做是最多只有2個關鍵幀的CAKeyframeAnimation。
  4. CAAnimationGroup,CAAnimation的子類,可以保存一組動畫對象,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時並發運行。

    屬性解析:

    1. animations:用來保存一組動畫對象的NSArray。
    2. 默認情況下,一組動畫對象是同時運行的,也可以通過設置動畫對象的beginTime屬性來更改動畫的開始時間。
  5. CATransition,CAAnimation的子類,用於做轉場動畫,能夠為層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉場動畫效果少一點。UINavigationController就是通過CATransition實現了將控制器的視圖推入屏幕的動畫效果。

    屬性解析:

    1. type:動畫過渡類型。
    2. subtype:動畫過渡方向。
    3. startProgress:動畫起點(在整體動畫的百分比)。
    4. endProgress:動畫終點(在整體動畫的百分比)。
      1. /* 過渡效果
    5.   fade     //交叉淡化過渡(不支持過渡方向) kCATransitionFade
    6.   push     //新視圖把舊視圖推出去  kCATransitionPush
    7.    moveIn   //新視圖移到舊視圖上面   kCATransitionMoveIn
         reveal   //將舊視圖移開,顯示下面的新視圖  kCATransitionReveal
         cube     //立方體翻滾效果
         oglFlip  //上下左右翻轉效果
         suckEffect   //收縮效果,如一塊布被抽走(不支持過渡方向)
         rippleEffect //滴水效果(不支持過渡方向)
         pageCurl     //向上翻頁效果
         pageUnCurl   //向下翻頁效果
         cameraIrisHollowOpen  //相機鏡頭打開效果(不支持過渡方向)
         cameraIrisHollowClose //相機鏡頭關上效果(不支持過渡方向)
        */    
        /* 過渡方向
         kCATransitionFromRight
         kCATransitionFromLeft
         kCATransitionFromBottom 
         kCATransitionFromTop
         */
      // CATransition的使用 
      CATransition *anim = [CATransition animation];
      anim.type = @ "cube" // 動畫過渡類型
      anim.subtype = kCATransitionFromTop;  // 動畫過渡方向
      anim.duration = 1;  // 動畫持續1s
      // 代理,動畫執行完畢后會調用delegate的animationDidStop:finished:
      anim.delegate = self;
      1. UIView動畫

            UIKit直接將動畫集成到UIView類中,當內部的一些屬性發生改變時,UIView將為這些改變提供動畫支持.

            執行動畫所需要的工作由UIView類自動完成,但仍要在希望執行動畫時通知視圖,為此需要將改變屬性的代碼放在[UIView beginAnimations:nil context:nil]和[UIView commitAnimations]之間

        常見方法解析:

            + (void)setAnimationDelegate:(id)delegate

        設置動畫代理對象,當動畫開始或者結束時會發消息給代理對象

            + (void)setAnimationWillStartSelector:(SEL)selector

        當動畫即將開始時,執行delegate對象的selector,並且把beginAnimations:context:中傳入的參數傳進selector

            + (void)setAnimationDidStopSelector:(SEL)selector

        當動畫結束時,執行delegate對象的selector,並且把beginAnimations:context:中傳入的參數傳進selector

        //說明需要執行動畫
        [UIView beginAnimations:nil context:nil];
        //設置動畫持續時間
        [UIView setAnimationDuration:1];
        //設置轉場動畫
        [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
        //交換子視圖的位置
        [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
        //提交動畫
        [UIView commitAnimations];

        UIView動畫

        + (void)setAnimationDuration:(NSTimeInterval)duration
        //動畫的持續時間,秒為單位
        + (void)setAnimationDelay:(NSTimeInterval)delay
        //動畫延遲delay秒后再開始
        + (void)setAnimationStartDate:(NSDate *)startDate
        //動畫的開始時間,默認為now
        + (void)setAnimationCurve:(UIViewAnimationCurve)curve
        //動畫的節奏控制,具體看下面的”備注”
        + (void)setAnimationRepeatCount:(float)repeatCount
        //動畫的重復次數
        + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses
        //如果設置為YES,代表動畫每次重復執行的效果會跟上一次相反
        + (void)setAnimationTransition:(UIViewAnimationTransition)transitionforView:(UIView *)view cache:(BOOL)cache

        Block動畫

            + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

        參數解析:

            duration:動畫的持續時間

            delay:動畫延遲delay秒后開始

            options:動畫的節奏控制

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

            completion:動畫結束后,會自動調用這個block

            + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion

        參數解析:

            duration:動畫的持續時間

            view:需要進行轉場動畫的視圖

            options:轉場動畫的類型

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

            completion:動畫結束后,會自動調用這個block

            + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion

        方法調用完畢后,相當於執行了下面兩句代碼:

            // 添加toView到父視圖

        [fromView.superview addSubview:toView];

            // 把fromView從父視圖中移除

        [fromView.superview removeFromSuperview];

        參數解析:

            duration:動畫的持續時間

            options:轉場動畫的類型

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

            completion:動畫結束后,會自動調用這個block

        UIImageView的幀動畫

             UIImageView可以讓一系列的圖片在特定的時間內按順序顯示 .

        相關屬性解析: 

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

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

            animationRepeatCount:動畫的執行次數(默認為0,代表無限循環) 

        相關方法解析: 

            - (void)startAnimating; 開始動畫 .

            - (void)stopAnimating;  停止動畫 .

            - (BOOL)isAnimating;  是否正在運行動畫.

        UIActivityIndicatorView

            是一個旋轉進度輪,可以用來告知用戶有一個操作正在進行中,一般用initWithActivityIndicatorStyle初始化

        方法解析:

            - (void)startAnimating;開始動畫

            - (void)stopAnimating;  停止動畫

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

        UIActivityIndicatorViewStyle有3個值可供選擇:

            UIActivityIndicatorViewStyleWhiteLarge   //大型白色指示器    

            UIActivityIndicatorViewStyleWhite      //標准尺寸白色指示器    

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM