注意:上圖中的黑色虛線表明」繼承」某個類,紅色虛線表明「遵照」某個協議數組
速度控制函數(CAMediaTimingFunction) 1.kCAMediaTimingFunctionLinear(線性):勻速,給你一個相對靜態的感受 2.kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入,而後加速離開 3.kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,而後減速的到達目的地 4.kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入,中間加速,而後減速的到達目的地。這個是默認的動畫行爲。 CAAnimation在分類中定義了代理方法 @interface NSObject (CAAnimationDelegate) - (void)animationDidStart:(CAAnimation *)anim; - (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag; @end fillMode屬性值(要想fillMode有效,最好設置removedOnCompletion=NO) kCAFillModeRemoved 這個是默認值,也就是說當動畫開始前和動畫結束後,動畫對layer都沒有影響,動畫結束後,layer會恢復到以前的狀態 kCAFillModeForwards 當動畫結束後,layer會一直保持着動畫最後的狀態
kCAFillModeBackwards 在動畫開始前,你只要將動畫加入一個layer,layer便當即進入動畫的初始狀態並等待動畫開始.你能夠這樣設定測試代碼,將一個動畫加入一個layer的時候延遲5秒執行.而後就會發如今動畫沒有開始的時候,只要動畫被加入了layer,layer便處於動畫初始狀態 kCAFillModeBoth 這個其實就是上面兩個的合成.動畫加入後開始以前,layer便處於動畫初始狀態,動畫結束後layer保持動畫最後的狀 CALayer上動畫的暫停和恢復 // t - active local time 圖層的本地時間 // tp - parent layer time 父圖層的時間 // 父圖層和圖層本地的時間換算公式 // t = (tp - beginTime) * speed + timeOffset // beginTime = tp - (t - timeOffset)/speed #pragma mark 暫停CALayer的動畫 -(void)pauseLayer:(CALayer*)layer { CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil]; layer.speed = 0.0; // 讓CALayer的時間中止走動 layer.timeOffset = pausedTime; // 讓CALayer的時間停留在pausedTime這個時刻 } #pragma mark 恢復CALayer的動畫 -(void)resumeLayer:(CALayer*)layer { CFTimeInterval pausedTime = layer.timeOffset; layer.speed = 1.0; // 讓CALayer的時間繼續行走 layer.timeOffset = 0.0; // 取消上次記錄的停留時刻 layer.beginTime = 0.0; // 取消上次設置的時間 // 計算暫停的時間(這裏用CACurrentMediaTime()-pausedTime也是同樣的) CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime; // 設置相對於父座標系的開始時間(日後退timeSincePause) layer.beginTime = timeSincePause; }
// 平移動畫 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"position"]; anim.duration = 1; // 動畫持續1秒 // 由於CGPoint是結構體,因此用NSValue包裝成一個OC對象 anim.fromValue = [NSValue valueWithCGPoint:CGPointMake(50, 50)]; anim.toValue = [NSValue valueWithCGPoint:CGPointMake(100, 100)]; [layer addAnimation:anim forKey:@"MyAnim"]; // 經過MyAnim能夠取回相應的動畫對象,好比用來中途取消動畫 // 縮放動畫 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; // 沒有設置fromValue說明當前狀態做爲初始值 // 寬度(width)變爲原來的2倍,高度(height)變爲原來的1.5倍 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeScale(2, 1.5, 1)]; anim.duration = 1; [layer addAnimation:anim forKey:nil]; // 旋轉動畫 CABasicAnimation *anim = [CABasicAnimation animationWithKeyPath:@"transform"]; // 這裏是以向量(1, 1, 0)爲軸,旋轉π/2弧度(90°) // 若是隻是在手機平面上旋轉,就設置向量爲(0, 0, 1),即Z軸 anim.toValue = [NSValue valueWithCATransform3D:CATransform3DMakeRotation(M_PI_2, 1, 1, 0)]; anim.duration = 1; [layer addAnimation:anim forKey:nil];
在關鍵幀動畫中還有一個很是重要的參數,那即是calculationMode(計算模式).
•主要針對的是每一幀的內容爲一個座標點的狀況,也就是對anchorPoint 和 position 進行的動畫.
•當在平面座標系中有多個離散的點的時候,能夠是離散的,也能夠直線相連後進行插值計算,也可使用圓滑的曲線將他們相連後進行插值計算.
•calculationMode目前提供以下幾種模式:
kCAAnimationLinear // calculationMode的默認值,表示當關鍵幀爲座標點的時候,關鍵幀之間直接直線相連進行插值計算;
kCAAnimationDiscrete // 離散的,就是不進行插值計算,全部關鍵幀直接逐個進行顯示;
kCAAnimationPaced // 使得動畫均勻進行,而不是按keyTimes設置的或者按關鍵幀平分時間,此時keyTimes和timingFunctions無效;
kCAAnimationCubic // 對關鍵幀爲座標點的關鍵幀進行圓滑曲線相連後插值計算,這裏的主要目的是使得運行的軌跡變得圓滑;
kCAAnimationCubicPaced // 看這個名字就知道和kCAAnimationCubic有必定聯繫,其實就是在kCAAnimationCubic的基礎上使得動畫運行變得均勻,就是系統時間內運動的距離相同,此時keyTimes以及timingFunctions也是無效的
/* 過渡效果 fade //交叉淡化過渡(不支持過渡方向) kCATransitionFade push //新視圖把舊視圖推出去 kCATransitionPush moveIn //新視圖移到舊視圖上面 kCATransitionMoveIn
reveal //將舊視圖移開,顯示下面的新視圖 kCATransitionReveal
cube //立方體翻滾效果 oglFlip //上下左右翻轉效果
suckEffect //收縮效果,如一塊布被抽走(不支持過渡方向)
rippleEffect //滴水效果(不支持過渡方向)
pageCurl //向上翻頁效果
pageUnCurl //向下翻頁效果
cameraIrisHollowOpen //相機鏡頭打開效果(不支持過渡方向)
cameraIrisHollowClose //相機鏡頭關上效果(不支持過渡方向)
*/
+ (void)setAnimationDelegate:(id)delegate // 設置動畫代理對象,當動畫開始或者結束時會發消息給代理對象 + (void)setAnimationWillStartSelector:(SEL)selector // 當動畫即將開始時,執行delegate對象的selector,而且把beginAnimations:context:中傳入的參數傳進selector + (void)setAnimationDidStopSelector:(SEL)selector // 當動畫結束時,執行delegate對象的selector,而且把beginAnimations:context:中傳入的參數傳進selector + (void)setAnimationDuration:(NSTimeInterval)duration // 動畫的持續時間,秒爲單位 + (void)setAnimationDelay:(NSTimeInterval)delay // 動畫延遲delay秒後再開始 + (void)setAnimationStartDate:(NSDate *)startDate // 動畫的開始時間,默認爲now + (void)setAnimationCurve:(UIViewAnimationCurve)curve // 動畫的節奏控制,具體看下面的」備註」 + (void)setAnimationRepeatCount:(float)repeatCount // 動畫的重複次數 + (void)setAnimationRepeatAutoreverses:(BOOL)repeatAutoreverses // 若是設置爲YES,表明動畫每次重複執行的效果會跟上一次相反 + (void)setAnimationTransition:(UIViewAnimationTransition)transition forView:(UIView *)view cache:(BOOL)cache // 設置視圖view的過渡效果, transition指定過渡類型, cache設置YES表明使用視圖緩存,性能較好
// 動畫的節奏控制,跟CAAnimation的timingFunction屬性相似 typedef NS_ENUM(NSInteger, UIViewAnimationCurve) { UIViewAnimationCurveEaseInOut, // slow at beginning and end UIViewAnimationCurveEaseIn, // slow at beginning UIViewAnimationCurveEaseOut, // slow at end UIViewAnimationCurveLinear };
typedef NS_ENUM(NSInteger, UIViewAnimationTransition) {
UIViewAnimationTransitionNone,
UIViewAnimationTransitionFlipFromLeft,
UIViewAnimationTransitionFlipFromRight,
UIViewAnimationTransitionCurlUp,
UIViewAnimationTransitionCurlDown,
};
// 說明須要執行動畫 [UIView beginAnimations:nil context:nil]; // 設置動畫持續事件 [UIView setAnimationDuration:1]; // 設置轉場動畫 [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES]; // 交換子視圖的位置 [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1]; // 提交動畫 [UIView commitAnimations];
+ (void)animateWithDuration:(NSTimeInterval)duration delay:(NSTimeInterval)delay options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
參數解析:緩存
// 動畫的節奏控制枚舉常量 UIViewAnimationOptionCurveEaseInOut UIViewAnimationOptionCurveEaseIn UIViewAnimationOptionCurveEaseOut UIViewAnimationOptionCurveLinear
+ (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion
參數解析:併發
ps: 轉場動畫的類型框架
// 轉場動畫的類型 UIViewAnimationOptionTransitionNone UIViewAnimationOptionTransitionFlipFromLeft UIViewAnimationOptionTransitionFlipFromRight UIViewAnimationOptionTransitionCurlUp UIViewAnimationOptionTransitionCurlDown UIViewAnimationOptionTransitionCrossDissolve UIViewAnimationOptionTransitionFlipFromTop UIViewAnimationOptionTransitionFlipFromBottom
+ (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion
方法調用完畢後,至關於執行了下面兩句代碼:函數
// 添加toView到父視圖性能
[fromView.superview addSubview:toView];測試
// 把fromView從父視圖中移除動畫
[fromView.superview removeFromSuperview];url
參數解析:spa
- (void)startAnimating; // 開始動畫 - (void)stopAnimating; // 中止動畫 - (BOOL)isAnimating; // 是否正在運行動畫
- (void)startAnimating; // 開始動畫 - (void)stopAnimating; // 中止動畫 - (BOOL)isAnimating; // 是否正在運行動畫 UIActivityIndicatorViewStyle有3個值可供選擇: UIActivityIndicatorViewStyleWhiteLarge //大型白色指示器 UIActivityIndicatorViewStyleWhite //標準尺寸白色指示器 UIActivityIndicatorViewStyleGray //灰色指示器,用於白色背景