coreAnimation簡介數組
Core Animation是一組很是強大的動畫處理API,使用它能作出很是炫麗的動畫效果,並且每每是事半功倍!Core Animation是全部動畫對象的父類,負責控制動畫的持續時間和速度,是個抽象類,不能直接使用,應該使用它具體的子類緩存
使用它須要先添加QuartzCore.framework和引入對應的框架<QuartzCore/QuartzCore.h>併發
相關屬性說明:屬性說明:(紅色表明來自CAMediaTiming協議的屬性)框架
duration:動畫的持續時間函數
開發步驟:動畫
一、初始化一個動畫對象(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 }
CABasicAnimation——基本動畫
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; // }]; }