CAMediaTimingFunction
- KCAMediaTimingFunctionLinear 線性,勻速
- KCAMediaTimingFunctionEaseIn 慢慢加速,突然停止
- KCAMediaTimingFunctionEaseOut 全速開始,減速停止
- KCAMediaTimingFunctionEaseInEaseOut 加速開始,減速停止
- KCAMediaTimingFunctionDefault 比KCAMediaTimingFunctionEaseInEaseOut稍慢的速度加速開始,減速停止
UIView動畫緩沖
options
參數添加常量
UIViewAnimationOptionCurveEaseInOut
UIViewAnimationOptionCurveEaseIn
UIViewAnimationOptionCurveEaseOut
UIViewAnimationOptionCurveLinear
緩沖和關鍵幀動畫
CAKeyframeAnimation 可以添加
values
,設置關鍵幀動畫,與之對應的timingFunctions
屬性可以為每次動畫添加不同的計時函數,數組的個數需要時values
數組個數減一,因為它描述的是每一幀之間的動畫速度的函數。
自定義緩沖函數
+ (instancetype)functionWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
- (instancetype)initWithControlPoints:(float)c1x :(float)c1y :(float)c2x :(float)c2y;
自己理解:動畫軌跡曲線是相對坐標曲線。上述方法得到的軌跡曲線是以(0,0),(c1x,c1y),(c2x,c2y)(1,1)繪制的三次貝塞爾曲線。
復雜動畫曲線 - 基于關鍵幀的緩沖
values
指定每個關鍵幀對應的屬性變化
keyTimes
指定每個關鍵幀的時間偏移
timingFunctions
指定每個關鍵幀之間的緩沖動畫
流程自動化和基于定時器的動畫
value = (endValue - startValue) * time + startValue
,原理就是根據時間,依靠函數計算出每個時間點的value。
- 總時間為1s,時間點和value的關系
- 直接使用上述函數是一個勻速的變換過程
- 通過一些函數,將每一幀動畫的時間點轉換成value對應位置的時間點,從而獲取與之對應的value,demo:https://github.com/warrenm/AHEasing
計算幀的持續時間
使用
CADisplayLink
,由于我們不能夠計算出一幀真實的持續時間。我們可以通過每幀開始刷新的時候用CACurrentMediaTIme()記錄當前時間,然后和上一幀記錄的時間比較。
Run Loop模式
使用CADisplayLink的時候,我們需要指定一個
run loop
和run loop mode
,界面更新都需要在主線程執行,對于run loop
我們使用主線程的run loop。run loop mode
是任務的優先級。
-
NSDefaultRunLoopMode
- 標準優先級 -
NSRunLoopCommonModes
- 高優先級,如果動畫在一個高頻率下運行,則會造成一些別的類似定時器的任務或者類似滑動的其他iOS動畫暫停 -
UITrackingRunLoopMode
- 用于UIScrollView
和其他空間的動畫 - 我們可以指定多個
run loop mode
,同時使用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];