1. 程式人生 > >ios 各種動畫animate效果

ios 各種動畫animate效果

最普通動畫: 
//開始動畫 
[UIView beginAnimations:nil context:nil];  
//設定動畫持續時間 
[UIView setAnimationDuration:2]; 
//動畫的內容 
frame.origin.x += 150; 
[img setFrame:frame]; 
//動畫結束 
[UIView commitAnimations]; 

連續動畫:一個接一個地顯示一系列的影象 
NSArray *myImages = [NSArray arrayWithObjects: 
[UIImage imageNamed:@"myImage1.png"], 
[UIImage imageNamed:@"myImage2.png"], 

[UIImage imageNamed:@"myImage3.png"], 
[UIImage imageNamed:@"myImage4.gif"], nil]; 

UIImageView *myAnimatedView = [UIImageView alloc]; 
[myAnimatedView initWithFrame:[self bounds]]; 
myAnimatedView.animationImages = myImages; //animationImages屬性返回一個存放動畫圖片的陣列 
myAnimatedView.animationDuration = 0.25; //瀏覽整個圖片一次所用的時間 

myAnimatedView.animationRepeatCount = 0; // 0 = loops forever 動畫重複次數 
[myAnimatedView startAnimating]; 
[self addSubview:myAnimatedView]; 
[myAnimatedView release]; 

CATransition Public API動畫: 
CATransition *animation = [CATransition animation]; 
//動畫時間 
    animation.duration = 0.5f; 
//先慢後快 
    animation.timingFunction = UIViewAnimationCurveEaseInOut; 

animation.fillMode = kCAFillModeForwards; 
//animation.removedOnCompletion = NO; 

//各種動畫效果 
/* 
kCATransitionFade; 
kCATransitionMoveIn; 
kCATransitionPush;z 
kCATransitionReveal; 
*/ 
/* 
kCATransitionFromRight; 
kCATransitionFromLeft; 
kCATransitionFromTop; 
kCATransitionFromBottom; 
*/ 
//各種組合 
animation.type = kCATransitionPush; 
animation.subtype = kCATransitionFromRight; 

[self.view.layer addAnimation:animation forKey:@"animation"]; 

CATransition Private API動畫: 
animation.type可以設定為以下效果 
動畫效果彙總: 
/* 
suckEffect(三角) 

rippleEffect(水波抖動) 

pageCurl(上翻頁) 

pageUnCurl(下翻頁) 

oglFlip(上下翻轉) 

cameraIris/cameraIrisHollowOpen/cameraIrisHollowClose  (鏡頭快門,這一組動畫是有效果,只是很難看,不建議使用 

而以下為則黑名單: 

spewEffect: 新版面在螢幕下方中間位置被釋放出來覆蓋舊版面. 

- genieEffect: 舊版面在螢幕左下方或右下方被吸走, 顯示出下面的新版面 (阿拉丁燈神?). 

- unGenieEffect: 新版面在螢幕左下方或右下方被釋放出來覆蓋舊版面. 

- twist: 版面以水平方向像龍捲風式轉出來. 

- tubey: 版面垂直附有彈性的轉出來. 

- swirl: 舊版面360度旋轉並淡出, 顯示出新版面. 

- charminUltra: 舊版面淡出並顯示新版面. 

- zoomyIn: 新版面由小放大走到前面, 舊版面放大由前面消失. 

- zoomyOut: 新版面螢幕外面縮放出現, 舊版面縮小消失. 

- oglApplicationSuspend: 像按"home" 按鈕的效果. 
*/ 

UIView Animations 動畫: 
[UIView beginAnimations:@"animationID" context:nil]; 
[UIView setAnimationDuration:0.5f]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; 
[UIView setAnimationRepeatAutoreverses:NO]; 
//以下四種效果 
/* 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.view cache:YES];//oglFlip, fromLeft 
[UIView setAnimationTransition:UIViewAnimationTransitionFlipFromRight forView:self.view cache:YES];//oglFlip, fromRight  
[UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; 
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES]; 
*/ 

[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0]; 
[UIView commitAnimations]; 
IOS4.0新方法: 
方法: +(void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations; 
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion; //多一個動畫結束後可以執行的操作. 
//下邊是巢狀使用,先變大再消失的動畫效果. 
[UIView animateWithDuration:1.25 animations:^{ 
CGAffineTransform newTransform = CGAffineTransformMakeScale(1.2, 1.2); 
[firstImageView setTransform:newTransform]; 
[secondImageView setTransform:newTransform];} 
completion:^(BOOL finished){ 
[UIView animateWithDuration:1.2 animations:^{ 
[firstImageView setAlpha:0]; 
[secondImageView setAlpha:0];} completion:^(BOOL finished){ 
[firstImageView removeFromSuperview]; 
[secondImageView removeFromSuperview]; }]; 
}];


一.基本方式:使用UIView類的UIViewAnimation擴充套件
+ (void)beginAnimations:(NSString *)animationID context:(void *)context; // 開始準備動畫+ (void)commitAnimations; // 執行動畫

// 沒有get方法,下面的set在快外呼叫無效+ (void)setAnimationDelegate:(id)delegate; // 委託default = nil+ (void)setAnimationWillStartSelector:(SEL)selector; // default = NULL. -animationWillStart:(NSString *)animationID context:(void *)context+ (void)setAnimationDidStopSelector:(SEL)selector; // default = NULL. -animationDidStop:(NSString *)animationID finished:(NSNumber *)finished context:(void *)context+ (void)setAnimationDuration:(NSTimeInterval)duration; // default = 0.2動畫時間+ (void)setAnimationDelay:(NSTimeInterval)delay; // default = 0.0延遲多少時間開始執行動畫+ (void)setAnimationStartDate:(NSDate *)startDate; // default = now ([NSDate date])動畫開始日期?不知道啥用.- -+ (void)setAnimationCurve:(UIViewAnimationCurve)curve; // default = UIViewAnimationCurveEaseInOut動畫方式+ (void)setAnimationRepeatCount:(float)repeatCount; // default = 0.0. May be fractional重複次數+ (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses; // default = NO. YES的話,動畫(非最後一次)結束後動態復原到最開始狀態+ (void)setAnimationBeginsFromCurrentState:(BOOL)fromCurrentState; // default = NO. YES,停止之前的動畫,從現在這裡開始新動畫the current view position is always used for new animations -- allowing animations to "pile up" on each other. Otherwise, the last end state is used for the animation (the default).
+ (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache; // 新增動畫到view上,cache是YES的時候比較高效,但是動畫過程中不能更新介面上的內容,NO時每一幀都重新畫,可以實時更新+ (void)setAnimationsEnabled:(BOOL)enabled; // 是否忽略一些動畫設定+ (BOOL)areAnimationsEnabled;


一個動畫的程式碼

[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurve:UIViewAnimationCurveLinear];
[UIView setAnimationDuration:2.7];
[UIView setAnimationTransition:transition forView:self.view cache:YES];
// operation>>>[self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
// end<<<<<<[UIView commitAnimations];

其中transition取值範圍

typedef enum {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
} UIViewAnimationTransition;

特點:基礎,使用方便,但是效果有限

二.block方式:使用UIView類的UIViewAnimationWithBlocks擴充套件

函式說明

+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0);//間隔,延遲,動畫引數(好像沒用?),介面更改塊,結束塊
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))

+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // toView added to fromView.superview, fromView removed from its superview介面替換,這裡的options引數有效

舉例:

[UIView animateWithDuration:0.7 delay:0 options:0 animations:^(){
self.view.alpha = 0.2;
[self.view exchangeSubviewAtIndex:1 withSubviewAtIndex:0];
self.view.alpha = 1;
} completion:^(BOOL finished)
{

}];

當areAnimationsEnabled為NO時,上面不能動畫顯示

[UIView transitionFromView:lImage toView:mImage duration:0.7 options:options completion:^(BOOL finished)
{
if (finished) {
[self.view addSubview:lImage];
[self.view sendSubviewToBack:lImage];
[self.view sendSubviewToBack:mImage];
}
}];

options取值範圍

enum {
UIViewAnimationOptionLayoutSubviews = 1 << 0,
UIViewAnimationOptionAllowUserInteraction = 1 << 1, // turn on user interaction while animatingUIViewAnimationOptionBeginFromCurrentState = 1 << 2, // start all views from current value, not initial valueUIViewAnimationOptionRepeat = 1 << 3, // repeat animation indefinitelyUIViewAnimationOptionAutoreverse = 1 << 4, // if repeat, run animation back and forthUIViewAnimationOptionOverrideInheritedDuration = 1 << 5, // ignore nested durationUIViewAnimationOptionOverrideInheritedCurve = 1 << 6, // ignore nested curveUIViewAnimationOptionAllowAnimatedContent = 1 << 7, // animate contents (applies to transitions only)UIViewAnimationOptionShowHideTransitionViews = 1 << 8, // flip to/from hidden state instead of adding/removing
UIViewAnimationOptionCurveEaseInOut = 0 << 16, // defaultUIViewAnimationOptionCurveEaseIn = 1 << 16,
UIViewAnimationOptionCurveEaseOut = 2 << 16,
UIViewAnimationOptionCurveLinear = 3 << 16,

UIViewAnimationOptionTransitionNone = 0 << 20, // defaultUIViewAnimationOptionTransitionFlipFromLeft = 1 << 20,
UIViewAnimationOptionTransitionFlipFromRight = 2 << 20,
UIViewAnimationOptionTransitionCurlUp = 3 << 20,
UIViewAnimationOptionTransitionCurlDown = 4 << 20,
UIViewAnimationOptionTransitionCrossDissolve = 5 << 20,//ios5UIViewAnimationOptionTransitionFlipFromTop = 6 << 20,//ios5UIViewAnimationOptionTransitionFlipFromBottom = 7 << 20,//ios5};
typedef NSUInteger UIViewAnimationOptions;

特點:快捷方便,效果更多.可以如上示例1那樣實現介面個元素屬性漸進變化的動態展示

對於不太複雜的動畫,上面的寫法很精練,因為只有一條語句,如果動畫太過複雜了,寫在這樣一條語句中就會顯得冗長了,對於程式碼除錯沒那麼方非常方便。
三:Core animation
core animation是以objc語言封裝的一套圖形渲染,投影以及動畫的庫的結合,使建立的使用者介面變得非常容易,通過以下方法:
1:使用簡單的程式設計方法實現高效能的合成
2:使用層物件建立複雜的使用者介面。
3:輕量型資料結構,能夠同時使幾百個層產生動畫。
4:不依賴於應用的主執行緒,動畫在單獨的執行緒裡執行
5:改進了應用程式效能。應用程式只需要重畫它變化的部分(區域性重新整理)。
6:靈活的佈局管理方式
2.    相關類
使用core animation,開發者不需要使用底層的API或者OpenGL就可以建立漂亮的動畫介面。
core animation類分成以下幾個:
1:提供顯示內容的層
2:動畫和時間類
3:佈局和約束類
4:將多個層分成幾個原子更新的執行類
2.1 層(layer)
層是core animation的基礎,檢視的一個例項,有一個CALayer例項作為父層(superlayer)以及在這層上新增的所有子層,建立的層結構成為layer tree
2.2動畫和時間類
隱式動畫
層的許多可視屬性的改變可以產生隱式的動畫效果,因為這些屬性都預設與一個動畫相關聯。通過簡單地設定可視的屬性值,層會由當前值到被設定的值產生漸變的動畫效果。比如,設定層的隱藏屬性為真,將觸發一個逐漸消失的動畫效果。

顯式動畫
通過建立一個動畫類和指定所需要的動畫效果,顯式的動畫並不改變層的屬性。
所有的核心動畫類都由抽象類CAAnimation繼承而來。CAAnimation採用CAMediaTiming協議。CAMediaTiming規 定了動畫的持續時間,速度以及重複次數。CAAnimation也採用了CAAction協議,該協議規定了在響應由層觸發的動作時,開始一個動畫的標準 方式。

核心動畫還提供其他的動畫類
CATransition,
CATransition規定了影響整個層內容的轉換效果,在動畫期間,它使層產生漸變(fade),推拉(push)以及揭示(reveal)的動畫效果。這些常用的轉換效果可以通過核心繪圖過濾器進行擴充套件。

CAAnimation,
CAAnimation允許大量的動畫物件被分為幾組,並且可以同時執行。
CAPropertyAnimation,是CAAnimation的子類,支援層在動畫期間,為層指定一個關鍵路徑。
CABasicAnimation.該類為層的屬性提供了簡單的插值。
CAKeyframeAnimation,
CAKeyframeAnimation提供關鍵幀動畫的支援。你可以為層的屬性指定一個關鍵路徑
2.3佈局管理類
CAKeyframeAnimation類用於管理所有子層的佈局,每個由CAConstraint類封裝的例項描述了各個子層之間的幾何位置關係。
2.4 執行管理類
可設定動畫層的屬性的修改必須是執行的一部分,CATransaction負責將許多動畫分成幾批原子型的更新進行顯示。



IOS中的動畫右兩大類1.UIView的檢視動畫2.Layer的動畫 UIView的動畫也是基於Layer的動畫
動畫的程式碼格式都很固定

1.UIView動畫

一般方式
[UIView beginAnimations:@"ddd" context:nil];//設定動畫
[UIView commitAnimations]; //提交動畫
這兩個是必須有的,然後在兩句的中間新增動畫的程式碼

[UIView beginAnimations:@"ddd" context:nil];//設定動畫 ddd為動畫名稱
[UIView setAnimationDuration:3];//定義動畫持續時間
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut]; //setAnimationCurve來定義動畫加速或減速方式
[UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.window cache:YES];
//設定動畫的樣式  forView為哪個view實現這個動畫效果
[UIView setAnimationDelay:3]; //設定動畫延遲多久執行
[UIView setAnimationDelegate:self];  //設定動畫的代理 實現動畫執行前後的方法 在commitAnimation之前設定
[UIView setAnimationDidStopSelector:@selector(stop)];//設定動畫結束後執行的方法
[UIView setAnimationWillStartSelector:@selector(star)];//設定動畫將要開始執行的方法
[UIView commitAnimations]; //提交動畫
typedef enum {
        UIViewAnimationTransitionNone,  //普通狀態
        UIViewAnimationTransitionFlipFromLeft,  //從左往右翻轉
        UIViewAnimationTransitionFlipFromRight,  //從右往左翻轉
        UIViewAnimationTransitionCurlUp, //向上翻頁
        UIViewAnimationTransitionCurlDown, //向下翻頁
    } UIViewAnimationTransition;
typedef enum {
        UIViewAnimationCurveEaseInOut,        
        UIViewAnimationCurveEaseIn,           
        UIViewAnimationCurveEaseOut,          
        UIViewAnimationCurveLinear
    } UIViewAnimationCurve;

[UIView beginAnimations:@"ddd" context:nil]; //設定動畫
view.frame = CGRectMake(200, 200, 100, 100);
[UIView commitAnimations]; //提交動畫
當view從本來的frame移動到新的frame時會慢慢漸變 而不是一下就完成了 中間也可以新增到上面那段中間 只是多種效果重疊

以下這些也可以加到  [UIView beginAnimations:@"ddd" context:nil]; [UIView commitAnimations];之間

view.transform = CGAffineTransformMakeTranslation(10, 10);//設定偏移量 相對於最初的 只能偏移一次
view.transform = CGAffineTransformTranslate(view.transform, 10, 10); //設定偏移量 偏移多次

self.view.transform = CGAffineTransformMakeRotation(M_PI);//設定旋轉度 只能旋轉一次
self.view.transform = CGAffineTransformRotate(self.view.transform, M_PI); //旋轉多次

self.view.transform = CGAffineTransformMakeScale(1.1, 1.1); //設定大小 只能改變一次 數值時相對於本來的幾倍
self.view.transform = CGAffineTransformScale(self.view.transform, 1.1, 1.1);//改變多次

self.view.transform = CGAffineTransformIdentity;//回到當初的樣子 執行一次
self.view.transform = CGAffineTransformInvert(self.view.transform);//得到相反的樣子 大小 方向 位置執行多次

Block方式
[UIView animateWithDuration:3 animations:^(void){
           
      //這裡相當於在begin和commint之間
    }completion:^(BOOL finished){
         //這裡相當於動畫執行完成後要執行的方法,可以繼續巢狀block
    }];

2.CAAnimation
需要新增庫,和包含標頭檔案


caanimation有多個子類

CABasicAnimation

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"opacity"];
//@""裡的字串有多種,可以自己找相關資料,一定要填對,動畫才會執行 opacity設定透明度 bounds.size設定大小
[animation setFromValue:[NSNumber numberWithFloat:1.0]]; //設定透明度從幾開始
[animation setToValue:[NSNumber numberWithFloat:0.3]];//設定透明度到幾結束
[animation setDuration:0.1]; //設定動畫時間
[animation setRepeatCount:100000];//設定重複時間
[animation setRepeatDuration:4];  //會限制重複次數
[animation setAutoreverses:NO];//設定是否從1.0到0.3 再從0.3到1.0 為一次  如果設定為NO則 1.0到0.3為一次
[animation setRemovedOnCompletion:YES]; //完成時移出動畫 預設也是
[view.layer addAnimation:animation forKey:@"abc"];//執行動畫

CAKeyframeAnimation

CAKeyframeAnimation *animation = [CAKeyframeAnimation animationWithKeyPath:@"position"];//設定view從初始位置經過一系列點
NSArray *postionAraay = [NSArray arrayWithObjects:[NSValue valueWithCGPoint:CGPointMake(100, 20)], [NSValue valueWithCGPoint:CGPointMake(40, 80)],[NSValue valueWithCGPoint:CGPointMake(30, 60)],[NSValue valueWithCGPoint:CGPointMake(20, 40)],[NSValue valueWithCGPoint:CGPointMake(0, 100)],nil];//設定點
   
NSArray *times = [NSArray arrayWithObjects:[NSNumber numberWithFloat:0.3],[NSNumber numberWithFloat:0.5],[NSNumber numberWithFloat:0.6],[NSNumber numberWithFloat:0.1],[NSNumber numberWithFloat:1.0], nil];  //設定移動過程的時間

[animation setKeyTimes:times];
[animation setValues:postionAraay];
[animation setDuration:5]; //設定動畫時間
[bigImage.layer addAnimation:animation forKey:@"dd"]; //執行動畫

CATransition

CATransition *animation = [CATransition animation];
animation.duration = 0.5f;
animation.timingFunction = UIViewAnimationCurveEaseInOut;
animation.fillMode = kCAFillModeForwards;
    /*
     kCATransitionFade;
     kCATransitionMoveIn;
     kCATransitionPush;
     kCATransitionReveal;
     */
    /*
     kCATransitionFromRight;
     kCATransitionFromLeft;
     kCATransitionFromTop;
     kCATransitionFromBottom;
     */
animation.type = kCATransitionPush;
animation.subtype = kCATransitionFromBottom;
[view.layer addAnimation:animation forKey:animation];
type也可以直接用字串
/*
     cube
     suckEffect 捲走
     oglFlip    翻轉
     rippleEffect  水波
     pageCurl   翻頁
     pageUnCurl
     cameraIrisHollowOpen
     cameraIrisHollowClose
*/