(轉)iOS動畫Core Animation

文章轉載:http://blog.sina.com.cn/s/blog_7b9d64af0101b8nh.htmlhtml

在iOS中動畫實現技術主要是:Core Animation。app

 Core Animation負責全部的滾動、旋轉、縮小和放大以及全部的iOS動畫效果。其中UIKit類一般都有animated:參數部分,它能夠容許是否使用動畫。 動畫

Core Animation主要是使用this

咱們知道每一個UIView都關聯到一個CALayer對象,CALayer是Core Animation中的圖層。spa

Core Animation主要就是經過修改圖層來改變UI的大小,位置,從而實現動畫效果。代理

 

能夠說,任何一個應用程序都離不開動畫!code

就連蘋果各個UI控件中的切換操做,都有它內在的動畫。htm

 

瞭解一下,關於動畫的一些知識。對象

 

任何知識點,都會遷出一系列的知識點。blog

 

[UIView beginAnimations:@"dropDownloadLabel" context:UIGraphicsGetCurrentContext()];

[UIView setAnimationDuration: 0.5];

[UIView setAnimationBeginsFromCurrentState: NO];

 

// 執行的動畫code

        

[UIView commitAnimations];

 

就將這段代碼做爲知識的切入點,開始瞭解吧。

 

[UIView beginAnimations:@"dropDownloadLabel" context:UIGraphicsGetCurrentContext()];

[UIView commitAnimations];

 

這兩句代碼,標記了一個動畫的開始和結束。在中間咱們能夠寫咱們的一些動畫操做!

 

beginAnimations方法

 

+ (void)beginAnimations:(NSString *)animationID context:(void *)context

用來,表示動畫的開始。

animationID:做爲動畫的標識

context:自定義的一些動畫數據,這些數據將發送給動畫的代理方法:setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

這個,參數,一般爲nil。咱們能夠直接設置爲nil。

這裏,咱們使用UIGraphicsGetCurrentContext();由於此方法默認也會返回nil。

 

該方法告訴系統,咱們將開始動畫。而且,在該方法後,咱們能夠經過setAnimationXXX(一系列方法)來設置咱們進行的動畫的一些參數。

完成動畫後,調用commitAnimations方法來通知系統,動畫結束。

 

至此,咱們知道,就是設置動畫的一些列參數的方法即setAnimationXXX方法。

 

[UIView setAnimationDuration: 0.5];

[UIView setAnimationBeginsFromCurrentState: NO];

 

動畫是能夠嵌套的。

 

[UIView beginAnimations:@"animation_1" context:UIGraphicsGetCurrentContext()];

// code1

[UIView beginAnimations:@"animation_2" context:UIGraphicsGetCurrentContext()];

// code2

[UIView commitAnimations];

 

[UIView commitAnimations];

 

 

若是咱們爲動畫設置了,setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

那麼當動畫開始或者中止的時候,動畫的animationID參數和context參數,會傳遞給setAnimationWillStartSelector:方法和setAnimationDidStopSelector:方法。

 

 

悲劇老是要發生的!

蘋果API在最後的描述中,給了這麼一句話:

 

Use of this method is discouraged in iOS 4.0 and later. You should use the block-based animation methods to specify your animations instead.

可見,在iOS 4.0 後,block語法,大大增多了。這種方式,是不建議的,須要咱們使用block的方式。

 

因而,動畫的block方式:

 

[UIView animateWithDuration:0.3f delay:0.0f options:UIViewAnimationOptionCurveLinear

                             animations:^{ // 執行的動畫code}

                             completion:^(BOOL finished){

                                 // 完成後執行code

                             }];

 

 

 

在儘可能用block來完成動畫,由於說不定啥時候,老的動畫方式,將被廢除。

 

到此,能夠告一段落。可是,我想將這簡單的動畫代碼,一查到底!

 

 

commitAnimations方法:

+ (void)commitAnimations

 

標記動畫結束。與beginAnimations方法成對使用。

例如:

[UIView commitAnimations];

 

一系列的setAnimationXXX方法:

 

setAnimationDuration方法:

 

+ (void)setAnimationDuration:(NSTimeInterval)duration

 

設置動畫持續時間(秒)

 

例如:

[UIView setAnimationDuration: 0.5];

 

 

setAnimationBeginsFromCurrentState方法

+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState

 

設置動畫開始時的狀態。

 

咱們構想一個場景:通常,咱們按下一個按鈕,將會執行動畫一次。

 

當YES時:當上一次動畫正在執行中,那麼當下一個動畫開始時,上一次動畫的當前狀態將成爲下一次動畫的開始狀態。

當NO時:當上一個動畫正在執行中,那麼當下一個動畫開始時,上一次動畫須要先恢復到完成時的狀態,而後在開始執行下一次動畫。

 

setAnimationStartDate方法

 

+ (void)setAnimationStartDate:(NSDate *)startTime

 

設置動畫開始時間。

 

setAnimationDelay方法

 

+ (void)setAnimationDelay:(NSTimeInterval)delay

 

設置動畫開始的延遲時間(秒

 

setAnimationCurve方法

 

+ (void)setAnimationCurve:(UIViewAnimationCurve)curve

 

設置動畫的曲線方式(就是動畫的整體變化的時間曲線:開始快最後慢,開始慢最後快,最後慢,均勻線性)。

 

curve參數以下:

 

typedef NS_ENUM(NSInteger, UIViewAnimationCurve) {

        UIViewAnimationCurveEaseInOut,         // slow at beginning and end

        UIViewAnimationCurveEaseIn,            // slow at beginning

        UIViewAnimationCurveEaseOut,           // slow at end

        UIViewAnimationCurveLinear

    };

 

 

setAnimationRepeatCount方法

 

+ (void)setAnimationRepeatCount:(float)repeatCount

 

設置動畫重複次數

 

setAnimationRepeatAutoreverses方法

 

+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses

 

設置動畫是否作一次反向的執行。

若是設置爲YES:動畫將執行:動畫初始狀態》動畫》動畫完成狀態》動畫》動畫初始狀態。

若是設置爲NO:默認值

 

setAnimationsEnabled方法

 

+ (void)setAnimationsEnabled:(BOOL)enabled

 

設置動畫是否可用!

YES:默認值。

NO:動畫效果被禁用

注意:僅僅是動畫是否可用,在動畫中被改變的UI對象依然是起做用的。僅僅是動畫效果被禁用了。

 

areAnimationsEnabled方法

 

+ (BOOL)areAnimationsEnabled

 

返回動畫效果是否被禁用。

 

提倡使用block方式來進行更加多的,簡潔的控制!

其實發現了,這篇博客已經有點長了!有點壞味道!

不過,回頭看,既然開篇就提到了Core Animation!

蘋果中,默認的的簡單動畫,能夠用setAnimationXXX一類的方法。可是若是,要讓動畫更加美觀,複雜,那我想就要考Core Animation了!

作個分割,如下了解Core Animation!

------------------------------------------------------------------------------------------------------------------------------------

 

先來個代碼吧!

 

 

[_imgPic setImage:image];// 設置新的圖片

            

           

            CATransition *animation = [CATransition animation];

            [animation setDuration:1.0];

            [animation setFillMode:kCAFillModeForwards];

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

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

            [animation setSubtype:kCATransitionFromTop];

            [_imgPic.layer addAnimation:animation forKey:nil];

 

一頭茫然啊!

 

UIView和CATransition兩種動畫是什麼關係?到底用哪種呢?

 

 

一種是UIView層面的。

一種是使用CATransition進行更低層次的控制。

第一種是UIView,UIView方式可能在低層也是使用CATransition進行了封裝,它只能用於一些簡單的、經常使用的效果展示。

因此,二者,每每在須要複雜的動畫,應該用CATransition吧。

相關文章
相關標籤/搜索