IOS簡易動畫效果

OS動畫淺析動畫


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

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

Core Animation主要是使用代理

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

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


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

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


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


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


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

[UIView setAnimationDuration: 0.5];

[UIViewsetAnimationBeginsFromCurrentState: 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];

[UIViewsetAnimationBeginsFromCurrentState: 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.3fdelay: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];

      [animationsetDuration:1.0];

      [animationsetFillMode:kCAFillModeForwards];

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

      [animationsetType:@"rippleEffect"];// rippleEffect

      [animationsetSubtype:kCATransitionFromTop];

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


一頭茫然啊!


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


 

一種是UIView層面的。

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

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

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

 

因此,另起爐竈!介紹CAAnimation!



但願對你有所幫助!

相關文章
相關標籤/搜索