CAMediaTimingFunction
- KCAMediaTimingFunctionLinear 線性毅贮,勻速
- KCAMediaTimingFunctionEaseIn 慢慢加速恢暖,突然停止
- KCAMediaTimingFunctionEaseOut 全速開始华畏,減速停止
- KCAMediaTimingFunctionEaseInEaseOut 加速開始勇吊,減速停止
- KCAMediaTimingFunctionDefault 比KCAMediaTimingFunctionEaseInEaseOut稍慢的速度加速開始,減速停止
UIView動畫緩沖
options
參數(shù)添加常量
UIViewAnimationOptionCurveEaseInOut
UIViewAnimationOptionCurveEaseIn
UIViewAnimationOptionCurveEaseOut
UIViewAnimationOptionCurveLinear
緩沖和關(guān)鍵幀動畫
CAKeyframeAnimation 可以添加
values
牡整,設(shè)置關(guān)鍵幀動畫钩乍,與之對應(yīng)的timingFunctions
屬性可以為每次動畫添加不同的計(jì)時(shí)函數(shù),數(shù)組的個數(shù)需要時(shí)values
數(shù)組個數(shù)減一画畅,因?yàn)樗枋龅氖敲恳粠g的動畫速度的函數(shù)砸琅。
自定義緩沖函數(shù)
+ (instancetype)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
- (instancetype)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
自己理解:動畫軌跡曲線是相對坐標(biāo)曲線。上述方法得到的軌跡曲線是以(0,0),(c1x,c1y),(c2x,c2y)(1,1)繪制的三次貝塞爾曲線轴踱。
復(fù)雜動畫曲線 - 基于關(guān)鍵幀的緩沖
values
指定每個關(guān)鍵幀對應(yīng)的屬性變化
keyTimes
指定每個關(guān)鍵幀的時(shí)間偏移
timingFunctions
指定每個關(guān)鍵幀之間的緩沖動畫
流程自動化和基于定時(shí)器的動畫
value = (endValue - startValue) * time + startValue
症脂,原理就是根據(jù)時(shí)間,依靠函數(shù)計(jì)算出每個時(shí)間點(diǎn)的value淫僻。
- 總時(shí)間為1s诱篷,時(shí)間點(diǎn)和value的關(guān)系
- 直接使用上述函數(shù)是一個勻速的變換過程
- 通過一些函數(shù),將每一幀動畫的時(shí)間點(diǎn)轉(zhuǎn)換成value對應(yīng)位置的時(shí)間點(diǎn)嘁傀,從而獲取與之對應(yīng)的value,demo:https://github.com/warrenm/AHEasing
計(jì)算幀的持續(xù)時(shí)間
使用
CADisplayLink
视粮,由于我們不能夠計(jì)算出一幀真實(shí)的持續(xù)時(shí)間细办。我們可以通過每幀開始刷新的時(shí)候用CACurrentMediaTIme()記錄當(dāng)前時(shí)間,然后和上一幀記錄的時(shí)間比較蕾殴。
Run Loop模式
使用CADisplayLink的時(shí)候笑撞,我們需要指定一個
run loop
和run loop mode
,界面更新都需要在主線程執(zhí)行钓觉,對于run loop
我們使用主線程的run loop茴肥。run loop mode
是任務(wù)的優(yōu)先級。
-
NSDefaultRunLoopMode
- 標(biāo)準(zhǔn)優(yōu)先級 -
NSRunLoopCommonModes
- 高優(yōu)先級荡灾,如果動畫在一個高頻率下運(yùn)行瓤狐,則會造成一些別的類似定時(shí)器的任務(wù)或者類似滑動的其他iOS動畫暫停 -
UITrackingRunLoopMode
- 用于UIScrollView
和其他空間的動畫 - 我們可以指定多個
run loop mode
,同時(shí)使用NSDefaultRunLoopMode
和UITrackingRunLoopMode
批幌,可以使動畫不會被滑動打斷础锐,也不會被其他UIKit控件動畫影響性能
self.timer = [CADisplayLink displayLinkWithTarget:self
selector:@selector(step:)];
[self.timer addToRunLoop:[NSRunLoop mainRunLoop]
forMode:UITrackingRunLoopMode];
[self.timer addToRunLoop:[NSRunLoop mainRunLoop]
forMode:NSDefaultRunLoopMode];