文章轉載: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吧。