1. 程式人生 > >iOS UIView動畫 效果詳解

iOS UIView動畫 效果詳解

http://www.jianshu.com/p/5abc038e4d94

iOS的動畫效果一直都很棒很,給人的感覺就是很炫酷很流暢,起到增強使用者體驗的作用。在APP開發中實現動畫效果有很多種方式,對於簡單的應用場景,我們可以使用UIKit提供的動畫來實現。

UIView動畫簡介

UIView動畫實質上是對Core Animation的封裝,提供簡潔的動畫介面。

UIView動畫可以設定的動畫屬性有:
1、大小變化(frame)
2、拉伸變化(bounds)
3、中心位置(center)
4、旋轉(transform)
5、透明度(alpha)
6、背景顏色(backgroundColor)
7、拉伸內容(contentStretch)

UIview 類方法動畫

1)動畫的開始和結束方法

1.1 動畫開始標記

[UIView beginAnimations:(nullable NSString *) context:(nullable void *)];

第一個引數:動畫標識
第二個引數:附加引數,在設定了代理的情況下,此引數將傳送到setAnimationWillStartSelector和setAnimationDidStopSelector所指定的方法。大部分情況下,我們設定為nil即可。

1.2 結束動畫標記

    [UIView commitAnimations];
2)動畫引數的設定方法
    //動畫持續時間
    [UIView
setAnimationDuration:(NSTimeInterval)];
    //動畫的代理物件
    [UIView setAnimationDelegate:(nullable id)];
    //設定動畫將開始時代理物件執行的SEL
    [UIView setAnimationWillStartSelector:(nullable SEL)];
    //設定動畫結束時代理物件執行的SEL
    [UIView setAnimationDidStopSelector:(nullable SEL)];
    //設定動畫延遲執行的時間
    [UIView setAnimationDelay:(NSTimeInterval
)];
    //設定動畫的重複次數
    [UIView setAnimationRepeatCount:(float)];
    //設定動畫的曲線
    [UIView setAnimationCurve:(UIViewAnimationCurve)];
    UIViewAnimationCurve的列舉值如下:
    UIViewAnimationCurveEaseInOut,         // 慢進慢出(預設值)
    UIViewAnimationCurveEaseIn,            // 慢進
    UIViewAnimationCurveEaseOut,           // 慢出
    UIViewAnimationCurveLinear             // 勻速
    //設定是否從當前狀態開始播放動畫
    [UIView setAnimationBeginsFromCurrentState:YES];
    假設上一個動畫正在播放,且尚未播放完畢,我們將要進行一個新的動畫:
    當為YES時:動畫將從上一個動畫所在的狀態開始播放
    當為NO時:動畫將從上一個動畫所指定的最終狀態開始播放(此時上一個動畫馬上結束)
    //設定動畫是否繼續執行相反的動畫
    [UIView setAnimationRepeatAutoreverses:(BOOL)];
    //是否禁用動畫效果(物件屬性依然會被改變,只是沒有動畫效果)
    [UIView setAnimationsEnabled:(BOOL)];
    //設定檢視的過渡效果
    [UIView setAnimationTransition:(UIViewAnimationTransition) forView:(nonnull UIView *) cache:(BOOL)];
     第一個引數:UIViewAnimationTransition的列舉值如下
         UIViewAnimationTransitionNone,              //不使用動畫
         UIViewAnimationTransitionFlipFromLeft,      //從左向右旋轉翻頁
         UIViewAnimationTransitionFlipFromRight,     //從右向左旋轉翻頁
         UIViewAnimationTransitionCurlUp,            //從下往上捲曲翻頁
         UIViewAnimationTransitionCurlDown,          //從上往下捲曲翻頁
     第二個引數:需要過渡效果的View
     第三個引數:是否使用檢視快取,YES:檢視在開始和結束時渲染一次;NO:檢視在每一幀都渲染
3)例項程式碼:

1、屬性變化動畫(以frame變化為例)

- (void)changeFrame {
    [UIView beginAnimations:@"FrameAni" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(startAni:)];
    [UIView setAnimationDidStopSelector:@selector(stopAni:)];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    self.cartCenter.frame = self.centerShow.frame;
    [UIView commitAnimations];
}

- (void)startAni:(NSString *)aniID {
    NSLog(@"%@ start",aniID);
}

- (void)stopAni:(NSString *)aniID {
    NSLog(@"%@ stop",aniID);
}

動畫效果:


NormalAni.gif

2、轉場效果動畫(以Flip效果為例)

- (void)flipAni {
    [UIView beginAnimations:@"FlipAni" context:nil];
    [UIView setAnimationDuration:1.0];
    [UIView setAnimationDelegate:self];
    [UIView setAnimationWillStartSelector:@selector(startAni:)];
    [UIView setAnimationDidStopSelector:@selector(stopAni:)];
    [UIView setAnimationRepeatCount:1];
    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
    [UIView setAnimationTransition:UIViewAnimationTransitionFlipFromLeft forView:self.centerShow cache:YES];
    self.centerShow.image = [UIImage imageNamed:@"service"];
    [UIView commitAnimations];
}

動畫效果:


ScreenTransitionAni.gif

UIview Block動畫

iOS4.0以後,增加了Block動畫塊,提供更簡潔的方式來實現動畫。

1)Block動畫方法

1、最簡潔的Block動畫:包含時間和動畫

 [UIView animateWithDuration:(NSTimeInterval)  //動畫持續時間
                  animations:^{
                  //執行的動畫
 }];

2、帶有動畫完成回撥的Block動畫

 [UIView animateWithDuration:(NSTimeInterval)  //動畫持續時間
                  animations:^{
                //執行的動畫
 }                completion:^(BOOL finished) {
                //動畫執行完畢後的操作
 }];

3、可設定延遲時間和過渡效果的Block動畫

 [UIView animateWithDuration:(NSTimeInterval) //動畫持續時間
                       delay:(NSTimeInterval) //動畫延遲執行的時間
                     options:(UIViewAnimationOptions) //動畫的過渡效果
                  animations:^{
                   //執行的動畫
 }                completion:^(BOOL finished) {
                   //動畫執行完畢後的操作
 }];

UIViewAnimationOptions的列舉值如下,可組合使用:

 UIViewAnimationOptionLayoutSubviews            //進行動畫時佈局子控制元件
 UIViewAnimationOptionAllowUserInteraction      //進行動畫時允許使用者互動
 UIViewAnimationOptionBeginFromCurrentState     //從當前狀態開始動畫
 UIViewAnimationOptionRepeat                    //無限重複執行動畫
 UIViewAnimationOptionAutoreverse               //執行動畫迴路
 UIViewAnimationOptionOverrideInheritedDuration //忽略巢狀動畫的執行時間設定
 UIViewAnimationOptionOverrideInheritedCurve    //忽略巢狀動畫的曲線設定
 UIViewAnimationOptionAllowAnimatedContent      //轉場:進行動畫時重繪檢視
 UIViewAnimationOptionShowHideTransitionViews   //轉場:移除(新增和移除圖層的)動畫效果
 UIViewAnimationOptionOverrideInheritedOptions  //不繼承父動畫設定

 UIViewAnimationOptionCurveEaseInOut            //時間曲線,慢進慢出(預設值)
 UIViewAnimationOptionCurveEaseIn               //時間曲線,慢進
 UIViewAnimationOptionCurveEaseOut              //時間曲線,慢出
 UIViewAnimationOptionCurveLinear               //時間曲線,勻速

 UIViewAnimationOptionTransitionNone            //轉場,不使用動畫
 UIViewAnimationOptionTransitionFlipFromLeft    //轉場,從左向右旋轉翻頁
 UIViewAnimationOptionTransitionFlipFromRight   //轉場,從右向左旋轉翻頁
 UIViewAnimationOptionTransitionCurlUp          //轉場,下往上捲曲翻頁
 UIViewAnimationOptionTransitionCurlDown        //轉場,從上往下捲曲翻頁
 UIViewAnimationOptionTransitionCrossDissolve   //轉場,交叉消失和出現
 UIViewAnimationOptionTransitionFlipFromTop     //轉場,從上向下旋轉翻頁
 UIViewAnimationOptionTransitionFlipFromBottom  //轉場,從下向上旋轉翻頁

4、Spring動畫
iOS7.0後新增Spring動畫(iOS系統動畫大部分採用Spring Animation,適用於所有可被新增動畫效果的屬性)

 [UIView animateWithDuration:(NSTimeInterval)//動畫持續時間
                       delay:(NSTimeInterval)//動畫延遲執行的時間
      usingSpringWithDamping:(CGFloat)//震動效果,範圍0~1,數值越小震動效果越明顯
       initialSpringVelocity:(CGFloat)//初始速度,數值越大初始速度越快
                     options:(UIViewAnimationOptions)//動畫的過渡效果
                  animations:^{
                     //執行的動畫
 }
                  completion:^(BOOL finished) {
                     //動畫執行完畢後的操作
 }];

5、Keyframes動畫
iOS7.0後新增關鍵幀動畫,支援屬性關鍵幀,不支援路徑關鍵幀

 [UIView animateKeyframesWithDuration:(NSTimeInterval)//動畫持續時間
                                delay:(NSTimeInterval)//動畫延遲執行的時間
                              options:(UIViewKeyframeAnimationOptions)//動畫的過渡效果
                           animations:^{
                         //執行的關鍵幀動畫
 }
                           completion:^(BOOL finished) {
                         //動畫執行完畢後的操作
 }];

UIViewKeyframeAnimationOptions的列舉值如下,可組合使用:

UIViewAnimationOptionLayoutSubviews           //進行動畫時佈局子控制元件
UIViewAnimationOptionAllowUserInteraction     //進行動畫時允許使用者互動
UIViewAnimationOptionBeginFromCurrentState    //從當前狀態開始動畫
UIViewAnimationOptionRepeat                   //無限重複執行動畫
UIViewAnimationOptionAutoreverse              //執行動畫迴路
UIViewAnimationOptionOverrideInheritedDuration //忽略巢狀動畫的執行時間設定
UIViewAnimationOptionOverrideInheritedOptions //不繼承父動畫設定

UIViewKeyframeAnimationOptionCalculationModeLinear     //運算模式 :連續
UIViewKeyframeAnimationOptionCalculationModeDiscrete   //運算模式 :離散
UIViewKeyframeAnimationOptionCalculationModePaced      //運算模式 :均勻執行
UIViewKeyframeAnimationOptionCalculationModeCubic      //運算模式 :平滑
UIViewKeyframeAnimationOptionCalculationModeCubicPaced //運算模式 :平滑均勻

各種運算模式的直觀比較如下圖:


圖片來源網路.png

增加關鍵幀的方法:

 [UIView addKeyframeWithRelativeStartTime:(double)//動畫開始的時間(佔總時間的比例)
                         relativeDuration:(double) //動畫持續時間(佔總時間的比例)
                               animations:^{
                             //執行的動畫
 }];

6、轉場動畫
6.1 從舊檢視轉到新檢視的動畫效果

 [UIView transitionFromView:(nonnull UIView *)
                     toView:(nonnull UIView *)
                   duration:(NSTimeInterval)
                    options:(UIViewAnimationOptions)
                 completion:^(BOOL finished) {
                     //動畫執行完畢後的操作
 }];

在該動畫過程中,fromView 會從父檢視中移除,並講 toView 新增到父檢視中,注意轉場動畫的作用物件是父檢視(過渡效果體現在父檢視上)。
呼叫該方法相當於執行下面兩句程式碼:

[fromView.superview addSubview:toView];
[fromView removeFromSuperview];

6.2 單個檢視的過渡效果

 [UIView transitionWithView:(nonnull UIView *)
                   duration:(NSTimeInterval)
                    options:(UIViewAnimationOptions)
                 animations:^{
                 //執行的動畫
 }
                 completion:^(BOOL finished) {
                 //動畫執行完畢後的操作
 }];
2)例項程式碼:

1、普通動畫
下面三段程式碼都實現了相同的檢視frame的變化,不同之處只在於其延遲時間、過渡效果和結束回撥。

- (void)blockAni1 {
    [UIView animateWithDuration:1.0 animations:^{
        self.cartCenter.frame = self.centerShow.frame;
    }];
}
- (void)blockAni2 {
    [UIView animateWithDuration:1.0 animations:^{
        self.cartCenter.frame = self.centerShow.frame;
    } completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}
- (void)blockAni3 {
    [UIView animateWithDuration:1.0 delay:1.0 options:UIViewAnimationOptionCurveEaseInOut animations:^{
        self.cartCenter.frame = self.centerShow.frame;
    } completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}

動畫效果:


NormalAni.gif

2、Spring動畫

- (void)blockAni4 {
    [UIView animateWithDuration:1.0 delay:0.f usingSpringWithDamping:0.5 initialSpringVelocity:5.0 options:UIViewAnimationOptionCurveLinear animations:^{
        self.cartCenter.frame = self.centerShow.frame;
    } completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}

動畫效果:


SpringAni.gif

3、Keyframes動畫
這裡以實現檢視背景顏色變化(紅-綠-藍-紫)的過程來演示關鍵幀動畫。

- (void)blockAni5 {
    self.centerShow.image = nil;
    [UIView animateKeyframesWithDuration:9.0 delay:0.f options:UIViewKeyframeAnimationOptionCalculationModeLinear animations:^{
        [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:1.0 / 4 animations:^{
            self.centerShow.backgroundColor = [UIColor colorWithRed:0.9475 green:0.1921 blue:0.1746 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:1.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.centerShow.backgroundColor = [UIColor colorWithRed:0.1064 green:0.6052 blue:0.0334 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:2.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.centerShow.backgroundColor = [UIColor colorWithRed:0.1366 green:0.3017 blue:0.8411 alpha:1.0];
        }];
        [UIView addKeyframeWithRelativeStartTime:3.0 / 4 relativeDuration:1.0 / 4 animations:^{
            self.centerShow.backgroundColor = [UIColor colorWithRed:0.619 green:0.037 blue:0.6719 alpha:1.0];
        }];
    } completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}

動畫效果:


KeyFramesAni.gif

4、轉場動畫
4.1 單個檢視的過渡效果

- (void)blockAni6 {
    [UIView transitionWithView:self.centerShow duration:1.0 options:UIViewAnimationOptionTransitionCrossDissolve animations:^{
        self.centerShow.image = [UIImage imageNamed:@"Service"];
    } completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}

動畫效果:


TransitionAni.gif

4.2 從舊檢視轉到新檢視的動畫效果

- (void)blockAni7 {
    UIImageView * newCenterShow = [[UIImageView alloc]initWithFrame:self.centerShow.frame];
    newCenterShow.image = [UIImage imageNamed:@"Service"];
    [UIView transitionFromView:self.centerShow toView:newCenterShow duration:1.0 options:UIViewAnimationOptionTransitionFlipFromLeft completion:^(BOOL finished) {
        NSLog(@"動畫結束");
    }];
}

動畫效果:


ScreenTransitionAni.gif

Next

接下來將更新核心動畫Core Animation



文/明仔Su(簡書作者)
原文連結:http://www.jianshu.com/p/5abc038e4d94
著作權歸作者所有,轉載請聯絡作者獲得授權,並標註“簡書作者”。