iOS開發CAAnimation詳解

來源:互聯網
上載者:User

標籤:

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為kCAFillModeForwardsfillMode:決定當前對象在非active時間段的行為。比如動畫開始之前,動畫結束之後beginTime:可以用來設定動畫順延強制時間,若想延遲2s,就設定為CACurrentMediaTime()+2,CACurrentMediaTime()為圖層的目前時間timingFunction:速度控制函數,控制動畫啟動並執行節奏delegate:動畫代理

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    //灰色指標,用於白色背景

iOS開發CAAnimation詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.