四箕戳、動畫
實踐下 iOS核心動畫高級技巧(顏色漸變)
CAShapeLayer(自己的筆記)
1请敦、學動畫先從POP開始 - 開篇
2、學動畫先從POP開始 深入淺出(登錄按鈕pop動畫)
7、從Core Animation到Facebook‘s Pop(1)
8、POP動畫引擎中Layer與CALayer的一點區(qū)別
3涛舍、CABasicAnimation使用總結
4、iOS 動畫從入門到無需可入!
5唆途、核心動畫(自己的筆記)
6富雅、CALayer(自己的筆記)
9、GeekBand - iOS 動畫全面總結
10 肛搬、老司機帶你走進Core Animation 之幾種動畫的簡單應用
11没佑、老司機帶你走進Core Animation 之粒子發(fā)射、TileLayer與異步繪制
12温赔、Core Animation Rao神iOS基礎
13蛤奢、放肆的使用UIBezierPath和CAShapeLayer畫各種圖形
14、iOS繪圖—— UIBezierPath 和 Core Graphics
Core Animation簡介
Core Animation陶贼,中文翻譯為核心動畫啤贩,它是一組非常強大的動畫處理API,使用它能做出非常炫麗的動畫效果骇窍,而且往往是事半功倍瓜晤。也就是說锥余,使用少量的代碼就可以實現(xiàn)非常強大的功能腹纳。
Core Animation可以用在Mac OS X和iOS平臺。
Core Animation的動畫執(zhí)行過程都是在后臺操作的驱犹,不會阻塞主線程嘲恍。
要注意的是,Core Animation是直接作用在CALayer上的雄驹,并非UIView佃牛。
掌握
核心動畫基本概念
基本動畫, 關鍵幀動畫, 動畫組, 轉場動畫
核心動畫繼承結構圖
一、Core Animation的使用步驟
1.首先得有CALayer
2.初始化一個CAAnimation對象医舆,并設置一些動畫相關屬性
3.通過調(diào)用CALayer的addAnimation:forKey:方法俘侠,增加CAAnimation對象到CALayer中象缀,這樣就能開始執(zhí)行動畫了
4.通過調(diào)用CALayer的removeAnimationForKey:方法可以停止CALayer中的動畫
二、CAAnimation 簡介
是所有動畫對象的父類爷速,負責控制動畫的持續(xù)時間和速度央星,是個抽象類,不能直接使用惫东,應該使用它具體的子類
屬性說明:
1. duration:動畫的持續(xù)時間
2. repeatCount:重復次數(shù)莉给,無限循環(huán)可以設置HUGE_VALF或者MAXFLOAT
3. repeatDuration:重復時間
4. fillMode:決定當前對象在非active時間段的行為。比如動畫開始之前或者動畫結束之后
5. beginTime:可以用來設置動畫延遲執(zhí)行時間廉沮,若想延遲2s颓遏,就設置為CACurrentMediaTime()+2,
CACurrentMediaTime()為圖層的當前時間
(以上來自CAMediaTiming協(xié)議的屬性)
6. removedOnCompletion:默認為YES滞时,代表動畫執(zhí)行完畢后就從圖層上移除叁幢,圖形會恢復到動畫執(zhí)行前的狀態(tài)。
如果想讓圖層保持顯示動畫執(zhí)行后的狀態(tài)坪稽,那就設置為NO遥皂,不過還要設置fillMode為kCAFillModeForwards
7. timingFunction:速度控制函數(shù),控制動畫運行的節(jié)奏
8. delegate:動畫代理
fillMode
removedOnCompletion
timingFunction
三刽漂、CAAnimation 動畫填充模式
fillMode屬性值(要想fillMode有效演训,最好設置removedOnCompletion = NO)
- kCAFillModeRemoved 默認值,也就是說當動畫開始前和動畫結束后贝咙,動畫對layer都沒有影響样悟,動畫結束后,layer會恢復到之前的狀態(tài)
- kCAFillModeForwards 當動畫結束后庭猩,layer會一直保持著動畫最后的狀態(tài)
- kCAFillModeBackwards 在動畫開始前窟她,只需要將動畫加入了一個layer,layer便立即進入動畫的初始狀態(tài)并等待動畫開始蔼水。
- kCAFillModeBoth 上面兩個的合成.動畫加入后開始之前震糖,layer便處于動畫初始狀態(tài),動畫結束后layer保持動畫最后的狀態(tài)
CAAnimation 速度控制函數(shù) (CAMediaTimingFunction)
kCAMediaTimingFunctionLinear(線性):勻速趴腋,給你一個相對靜態(tài)的感覺
kCAMediaTimingFunctionEaseIn(漸進):動畫緩慢進入吊说,然后加速離開
kCAMediaTimingFunctionEaseOut(漸出):動畫全速進入,然后減速的到達目的地
kCAMediaTimingFunctionEaseInEaseOut(漸進漸出):動畫緩慢的進入优炬,中間加速颁井,然后減速的到達目的地。這個是默認的動畫行為蠢护。
CAAnimation在分類中定義了代理方法
@interface NSObject (CAAnimationDelegate)
- (void)animationDidStart:(CAAnimation *)anim;
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag;
@end
CALayer上動畫的暫停和恢復
#pragma mark 暫停CALayer的動畫
-(void)pauseLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
// 讓CALayer的時間停止走動
layer.speed = 0.0;
// 讓CALayer的時間停留在pausedTime這個時刻
layer.timeOffset = pausedTime;
}
CALayer上動畫的恢復
#pragma mark 恢復CALayer的動畫
-(void)resumeLayer:(CALayer*)layer
{
CFTimeInterval pausedTime = layer.timeOffset;
// 1. 讓CALayer的時間繼續(xù)行走
layer.speed = 1.0;
// 2. 取消上次記錄的停留時刻
layer.timeOffset = 0.0;
// 3. 取消上次設置的時間
layer.beginTime = 0.0;
// 4. 計算暫停的時間(這里也可以用CACurrentMediaTime()-pausedTime)
CFTimeInterval timeSincePause = [layer convertTime:CACurrentMediaTime() fromLayer:nil] - pausedTime;
// 5. 設置相對于父坐標系的開始時間(往后退timeSincePause)
layer.beginTime = timeSincePause;
}
CAPropertyAnimation
是CAAnimation的子類雅宾,也是個抽象類,要想創(chuàng)建動畫對象葵硕,應該使用它的兩個子類:
- CABasicAnimation
- CAKeyframeAnimation
屬性說明:
keyPath:通過指定CALayer的一個屬性名稱為keyPath(NSString類型)眉抬,并且對CALayer的這個屬性的值進行修改贯吓,達到相應的動畫效果。比如蜀变,指定@“position”為keyPath宣决,就修改CALayer的position屬性的值,以達到平移的動畫效果
keyPath屬性說明:
transform.scale = 比例轉換
transform.rotation = 旋轉
transform.rotation.x = x軸旋轉
transform.rotation.y = y軸旋轉
opacity = 透明度
margin = 邊距
position = 位移
backgroundColor = 背景顏色
cornerRadius = 圓角
borderWidth = 邊框寬度
bounds = 位置昏苏,體積
contents = 內(nèi)容
contentsRect = 面積
frame = 位置尊沸,體積
hidden = 是否隱藏
shadowColor = 陰影顏色
shadowOffset = 陰影偏移
shadowOpacity = 陰影透明
shadowRadius = 陰影半徑
------
一、CABasicAnimation 基本動畫
基本動畫贤惯,是CAPropertyAnimation的子類
屬性說明:
fromValue:keyPath相應屬性的初始值
toValue:keyPath相應屬性的結束值
動畫過程說明:
隨著動畫的進行洼专,在長度為duration的持續(xù)時間內(nèi),keyPath相應屬性的值從fromValue漸漸地變?yōu)閠oValue
keyPath內(nèi)容是CALayer的可動畫Animatable屬性
如果fillMode=kCAFillModeForwards同時removedOnComletion=NO孵构,那么在動畫執(zhí)行完畢后屁商,圖層會保持顯示動畫執(zhí)行后的狀態(tài)。但在實質(zhì)上颈墅,圖層的屬性值還是動畫執(zhí)行前的初始值蜡镶,并沒有真正被改變。
二恤筛、CAKeyframeAnimation關鍵幀動畫
關鍵幀動畫官还,也是CAPropertyAnimation的子類,與CABasicAnimation的區(qū)別是:
CABasicAnimation只能從一個數(shù)值(fromValue)變到另一個數(shù)值(toValue)毒坛,而CAKeyframeAnimation會使用一個NSArray保存這些數(shù)值
屬性說明:
values:上述的NSArray對象望伦。里面的元素稱為“關鍵幀”(keyframe)。動畫對象會在指定的時間(duration)內(nèi)煎殷,依次顯示values數(shù)組中的每一個關鍵幀
path:可以設置一個CGPathRef屯伞、CGMutablePathRef,讓圖層按照路徑軌跡移動豪直。path只對CALayer的anchorPoint和position起作用劣摇。如果設置了path,那么values將被忽略
keyTimes:可以為對應的關鍵幀指定對應的時間點弓乙,其取值范圍為0到1.0末融,keyTimes中的每一個時間值都對應values中的每一幀。如果沒有設置keyTimes唆貌,各個關鍵幀的時間是平分的
注:CABasicAnimation可看做是只有2個關鍵幀的CAKeyframeAnimation
CAAnimationGroup 動畫組
動畫組滑潘,是CAAnimation的子類,可以保存一組動畫對象锨咙,將CAAnimationGroup對象加入層后,組中所有動畫對象可以同時并發(fā)運行
屬性說明:
animations:用來保存一組動畫對象的NSArray
默認情況下追逮,一組動畫對象是同時運行的酪刀,也可以通過設置動畫對象的beginTime屬性來更改動畫的開始時間
三粹舵、轉場動畫 CATransition
CATransition是CAAnimation的子類,用于做轉場動畫骂倘,能夠為層提供移出屏幕和移入屏幕的動畫效果眼滤。iOS比Mac OS X的轉場動畫效果少一點
UINavigationController就是通過CATransition實現(xiàn)了將控制器的視圖推入屏幕的動畫效果
動畫屬性:
type:動畫過渡類型
subtype:動畫過渡方向
startProgress:動畫起點(在整體動畫的百分比)
endProgress:動畫終點(在整體動畫的百分比)
轉場動畫過渡效果
使用UIView動畫函數(shù)實現(xiàn)轉場動畫——單視圖
- (void)transitionWithView:(UIView *)view duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options animations:(void (^)(void))animations completion:(void (^)(BOOL finished))completion;
參數(shù)說明:
duration:動畫的持續(xù)時間
view:需要進行轉場動畫的視圖
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束后,會自動調(diào)用這個block
使用UIView動畫函數(shù)實現(xiàn)轉場動畫——雙視圖
- (void)transitionFromView:(UIView *)fromView toView:(UIView *)toView duration:(NSTimeInterval)duration options:(UIViewAnimationOptions)options completion:(void (^)(BOOL finished))completion;
參數(shù)說明:
duration:動畫的持續(xù)時間
options:轉場動畫的類型
animations:將改變視圖屬性的代碼放在這個block中
completion:動畫結束后历涝,會自動調(diào)用這個block
CADisplayLink
CADisplayLink是一種以屏幕刷新頻率觸發(fā)的時鐘機制诅需,每秒鐘執(zhí)行大約60次左右
CADisplayLink是一個計時器,可以使繪圖代碼與視圖的刷新頻率保持同步荧库,而NSTimer無法確保計時器實際被觸發(fā)的準確時間
使用方法:
定義CADisplayLink并制定觸發(fā)調(diào)用方法
將顯示鏈接添加到主運行循環(huán)隊列
完堰塌。