iOS 核心動畫 -- UIView包裝的動畫

coreAnimation簡介數組

    Core Animation是一組很是強大的動畫處理API,使用它能作出很是炫麗的動畫效果,並且每每是事半功倍!Core Animation是全部動畫對象的父類,負責控制動畫的持續時間和速度,是個抽象類,不能直接使用,應該使用它具體的子類緩存

    使用它須要先添加QuartzCore.framework和引入對應的框架<QuartzCore/QuartzCore.h>併發

    相關屬性說明:屬性說明:(紅色表明來自CAMediaTiming協議的屬性)框架

           duration:動畫的持續時間函數

           repeatCount:重複次數,無限循環能夠設置HUGE_VALF或者MAXFLOAT
           repeatDuration:重複時間
           removedOnCompletion:默認爲YES,表明動畫執行完畢後就從圖層上移除,圖形會恢復到動畫執行前的狀態。若是想讓圖層保持顯示動畫執行後的狀態,那就設置爲NO,不過還要設置fillMode爲kCAFillModeForwards
           fillMode:決定當前對象在非active時間段的行爲。好比動畫開始以前或者動畫結束以後
           beginTime:能夠用來設置動畫延遲執行時間,若想延遲2s,就設置爲CACurrentMediaTime()+2,CACurrentMediaTime()爲圖層的當前時間
             timingFunction:速度控制函數,控制動畫運行的節奏
                 delegate:動畫代理
  
    fillMode屬性值(要想fillMode有效,最好設置removedOnCompletion = NO)
    kCAFillModeRemoved 這個是默認值,也就是說當動畫開始前和動畫結束後,動畫對layer都沒有影響,動畫結束後,layer會恢復到以前的狀態
        kCAFillModeForwards 當動畫結束後,layer會一直保持着動畫最後的狀態
        kCAFillModeBackwards 在動畫開始前,只須要將動畫加入了一個layer,layer便當即進入動畫的初始狀態並等待動畫開始。
    kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入後開始以前,layer便處於動畫初始狀態,動畫結束後layer保持動畫最後的狀態
    速度控制函數(CAMediaTimingFunction)
    1.kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態的感受
    2.kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入,而後加速離開
    3.kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,而後減速的到達目的地
    4.kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速,而後減速的到達目的地。這個是默認的動畫行爲。

           開發步驟:動畫

        一、初始化一個動畫對象(CAAnimation)並設置一些動畫相關屬性。url

        二、CALayer中可動畫屬性均可以經過CAAnimation實現動畫效果,包括:opacity、position、transform、bounds、contents等(能夠在API文檔中搜索:CALayer Animatable Properties)spa

        三、添加動畫對象到層(CALayer)中,開始執行動畫線程

        四、經過調用CALayer的addAnimation:forKey增長動畫到層(CALayer)中,這樣就能觸發動畫了。經過調用removeAnimationForKey能夠中止層中的動畫代理

        五、Core Animation的動畫執行過程都是在後臺操做的,不會阻塞主線程

coreAnimation的繼承結構

 

動畫暫停

 1 #pragma mark 暫停CALayer的動畫
 2 -(void)pauseLayer:(CALayer*)layer
 3 {
 4     CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
 5 
 6     // 讓CALayer的時間中止走動
 7       layer.speed = 0.0;
 8     // 讓CALayer的時間停留在pausedTime這個時刻
 9     layer.timeOffset = pausedTime;
10 }

動畫的恢復

 1 #pragma mark 恢復CALayer的動畫
 2 -(void)resumeLayer:(CALayer*)layer
 3 {
 4     CFTimeInterval pausedTime = layer.timeOffset;
 5     // 1. 讓CALayer的時間繼續行走
 6       layer.speed = 1.0;
 7     // 2. 取消上次記錄的停留時刻
 8       layer.timeOffset = 0.0;
 9     // 3. 取消上次設置的時間
10       layer.beginTime = 0.0;    
11     // 4. 計算暫停的時間(這裏也能夠用CACurrentMediaTime()-pausedTime)
12     CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
13     // 5. 設置相對於父座標系的開始時間(日後退timeSincePause)
14       layer.beginTime = timeSincePause;
15 }
CAPropertyAnimation 是CAAnimation的子類,也是個抽象類,要想建立動畫對象,應該使用它的兩個子類:
CABasicAnimation
CAKeyframeAnimation
 
屬性說明:
keyPath:經過指定CALayer的一個屬性名稱爲keyPath(NSString類型),而且對CALayer的這個屬性的值進行修改,達到相應的動畫效果。好比,指定@「position」爲keyPath,就修改CALayer的position屬性的值,以達到平移的動畫效果

CABasicAnimation——基本動畫

基本動畫,是CAPropertyAnimation的子類
屬性說明:
fromValue:keyPath相應屬性的初始值
toValue:keyPath相應屬性的結束值
動畫過程說明:
隨着動畫的進行,在長度爲duration的持續時間內,keyPath相應屬性的值從fromValue漸漸地變爲toValue
keyPath內容是CALayer的可動畫Animatable屬性
若是fillMode=kCAFillModeForwards同時removedOnComletion=NO,那麼在動畫執行完畢後,圖層會保持顯示動畫執行後的狀態。但在實質上,圖層的屬性值仍是動畫執行前的初始值,並無真正被改變。
 
關鍵幀動畫,也是CAPropertyAnimation的子類,與CABasicAnimation的區別是:
CABasicAnimation只能從一個數值(fromValue)變到另外一個數值(toValue),而CAKeyframeAnimation會使用一個NSArray保存這些數值
屬性說明:
    values:上述的NSArray對象。裏面的元素稱爲「關鍵幀」(keyframe)。動畫對象會在指定的時間(duration)內,依次顯示values數組中的每個關鍵幀
    path:能夠設置一個CGPathRef、CGMutablePathRef,讓圖層按照路徑軌跡移動。path只對CALayer的anchorPoint和position起做用。若是設置了path,那麼values將被忽略
    keyTimes:能夠爲對應的關鍵幀指定對應的時間點,其取值範圍爲0到1.0,keyTimes中的每個時間值都對應values中的每一幀。若是沒有設置keyTimes,各個關鍵幀的時間是平分的
    CABasicAnimation可看作是隻有2個關鍵幀的CAKeyframeAnimation
 
CAAnimationGroup  動畫組
       
動畫組,是CAAnimation的子類,能夠保存一組動畫對象,將CAAnimationGroup對象加入層後,組中全部動畫對象能夠同時併發運行
屬性說明:
animations:用來保存一組動畫對象的NSArray
默認狀況下,一組動畫對象是同時運行的,也能夠經過設置動畫對象的beginTime屬性來更改動畫的開始時間
轉場動畫 --  CATransition
  CATransition是CAAnimation的子類,用於作轉場動畫,可以爲層提供移出屏幕和移入屏幕的動畫效果。iOS比Mac OS X的轉場動畫效果少一點
  UINavigationController就是經過CATransition實現了將控制器的視圖推入屏幕的動畫效果
  動畫屬性:
  type:動畫過渡類型
  subtype:動畫過渡方向
  startProgress:動畫起點(在總體動畫的百分比)
  endProgress:動畫終點(在總體動畫的百分比)
 
轉場動畫過渡效果
使用UIView動畫函數實現轉場動畫——單視圖
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
參數說明:
duration:動畫的持續時間
view:須要進行轉場動畫的視圖
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束後,會自動調用這個block
 
 
使用UIView動畫函數實現轉場動畫——雙視圖
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
參數說明:
duration:動畫的持續時間
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束後,會自動調用這個block
 
CADisplayLink
  CADisplayLink是一種以屏幕刷新頻率觸發的時鐘機制,每秒鐘執行大約60次左右
  CADisplayLink是一個計時器,可使繪圖代碼與視圖的刷新頻率保持同步,而NSTimer沒法確保計時器實際被觸發的準確時間
  使用方法:
  定義CADisplayLink並制定觸發調用方法
  將顯示連接添加到主運行循環隊列
UIView包裝的動畫相關方法 
 
 1 /**
 2  *  beginAnimations  開始動畫
 3  *
 4  *  @param animationID 動畫名稱
 5  *  @param context     動畫上下文
 6  */
 7 + (void)beginAnimations:(NSString *)animationID context:(void *)context;
 8 + (void)commitAnimations;  //提交動畫
 9 
10 
11 + (void)setAnimationDelegate:(id)delegate;                          // 設置動畫代理
12 + (void)setAnimationWillStartSelector:(SEL)selector;                // 當將要動畫的時候會調用(selector)方法
13 + (void)setAnimationDidStopSelector:(SEL)selector;                  // 當動畫中止的時候會調用(selector)方法
14 + (void)setAnimationDuration:(NSTimeInterval)duration;              // 設置動畫持續時間
15 + (void)setAnimationDelay:(NSTimeInterval)delay;                    // delay延遲執行動畫
16 + (void)setAnimationStartDate:(NSDate *)startDate;                  // startDate動畫啓動時間
17 + (void)setAnimationCurve:(UIViewAnimationCurve)curve;              // 設置動畫趨勢(線性,中間快速頭尾慢等)
18 + (void)setAnimationRepeatCount:(float)repeatCount;                 // 動畫執行次數
19 + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses;    // 動畫執行完畢以後,YES -- 自動動畫恢復 ,默認爲NO
20 
21 /**
22  *  Transition -- 轉場 -- Abel's Den
23  *
24  UIViewAnimationTransitionNone, -- 空
25  UIViewAnimationTransitionFlipFromLeft, -- 左邊開始轉場
26  UIViewAnimationTransitionFlipFromRight, -- 右邊開始轉場
27  UIViewAnimationTransitionCurlUp, -- 相似翻頁效果
28  UIViewAnimationTransitionCurlDown, -- 向下轉場
29  *  @param transition 轉場參數
30  *  @param view       哪一個視圖
31  *  @param cache      是否開啓緩存
32  */
33 + (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache;
34 /**
35  *  這個屬性在動畫塊外沒有任何做用。使用beginAnimations:context:類方法來開始一個動畫塊並用commitAnimations類方法來結束。默認動畫不循環。
36  *
37  *  @param enabled 激活動畫
38  */
39 + (void)setAnimationsEnabled:(BOOL)enabled;
40 
41 + (BOOL)areAnimationsEnabled;
42 + (void)performWithoutAnimation:(void (^)(void))actionsWithoutAnimation -- 將不想執行動畫的操做放在這裏
43 
44 @end
45 
46 @interface UIView(UIViewAnimationWithBlocks) --- block 動畫
47 
48 /**
49  *   block 動畫
50  *
51  *  @param duration            持續時間
52  *  @param delay               延遲時間
53  *  @param options             選項
54  *  @param animations          動畫操做
55  */
56 + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
57 
58 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(4_0);
59 
60 + (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations
61 
62 
63 
64 + (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay usingSpringWithDamping:(CGFloat)dampingRatio initialSpringVelocity:(CGFloat)velocity options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
65 
66 //過分動畫  -- 轉場
67 + (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
68 
69 + (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
70 
71 
72 
73 
74 
75 + (void)performSystemAnimation:(UISystemAnimation)animation onViews:(NSArray *)views options:(UIViewAnimationOptions)options animations:(void (^)(void))parallelAnimations completion:(void (^)(BOOL finished))completion NS_AVAILABLE_IOS(7_0);
76 
77 
78 UIView (UIViewKeyframeAnimations) 關鍵幀動畫的API。
79 
80 + (void)animateKeyframesWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewKeyframeAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
81 
82 /**
83  *  /指定一個關鍵幀的單個貞的時間和動畫,從IOS7開始使用
84  //這裏說一下參數,第一個frameStartTime實際上是個倍數從0到1,假設一個動畫持續的時間是2秒
85  //設置frameStartTime爲0.5,那麼後面設置的動畫,將會在總體動畫執行1秒後開始執行
86  //第二個參數frameDuration同第一個,是指動畫持續時間
87  //第三個是一個block對象,裏面就是你設置的所要執行的動畫,無參數和返回值
88  */
89 
90 + (void)addKeyframeWithRelativeStartTime:(double)frameStartTime relativeDuration:(double)frameDuration animations:(void (^)(void))animations NS_AVAILABLE_IOS(7_0);

push 轉場動畫


- (void)moreBtnClick
{
    
//    
//    CA_EXTERN NSString * const kCATransitionFade         ----
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionMoveIn   -----
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionPush     -----
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionReveal    -------
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    
//    /* Common transition subtypes. */
//    
//    CA_EXTERN NSString * const kCATransitionFromRight    ----
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionFromLeft
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionFromTop
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCATransitionFromBottom
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
    
//    CA_EXTERN NSString * const kCAMediaTimingFunctionLinear
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCAMediaTimingFunctionEaseIn
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCAMediaTimingFunctionEaseOut
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCAMediaTimingFunctionEaseInEaseOut
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCAMediaTimingFunctionDefault
//    __OSX_AVAILABLE_STARTING (__MAC_10_6, __IPHONE_3_0);

//    
//    /* `rotationMode' strings. */
//    
//    CA_EXTERN NSString * const kCAAnimationRotateAuto
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
//    CA_EXTERN NSString * const kCAAnimationRotateAutoReverse
//    __OSX_AVAILABLE_STARTING (__MAC_10_5, __IPHONE_2_0);
/** 
    transition.type
 
 fade           交叉淡化過渡
 push           新視圖把舊視圖推出去
 moveIn         新視圖移到舊視圖上面
 reveal         將舊視圖移開,顯示下面的新視圖
 cube           立方體翻滾效果
 oglFlip        上下左右翻轉效果
 suckEffect     收縮效果,如一塊布被抽走
 rippleEffect   水滴效果
 pageCurl       向上翻頁效果
 pageUnCurl     向下翻頁效果
 cameraIrisHollowOpen   相機鏡頭打開效果
 cameraIrisHollowClose  相機鏡頭關閉效果


 
 
 */
    
    
    NSLog(@"更多");
    SDViewController *vc = [[SDViewController alloc] init];
   
    CATransition *transition = [CATransition animation];
    transition.duration = 0.618f;
    
    transition.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
    transition.type =  @"fade"; //@"push"; //@"cube";
    transition.subtype = kCATransitionFromBottom;
    transition.delegate = self;
    
    [self.navigationController.view.layer addAnimation:transition forKey:nil];
    
    
//    [self.navigationController pushViewController: firstViewController animated:YES];

    [self.navigationController pushViewController:vc animated:YES];
    
//    [self presentViewController:vc animated:YES completion:^{
//       
//    }];
//    [UIView animateWithDuration:1 animations:^{
//       self.sdVC.view.transform = CGAffineTransformMakeTranslation(0, self.view.frame.size.height);
//        
////        self.tableView.scrollEnabled = NO;
//        self.navigationController.navigationBarHidden = YES;
//    }];
}
相關文章
相關標籤/搜索