iOS Core Animation(八)- 緩沖

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 looprun loop mode,界面更新都需要在主線程執行,對于run loop我們使用主線程的run loop。run loop mode是任務的優先級。

  • NSDefaultRunLoopMode - 標準優先級
  • NSRunLoopCommonModes - 高優先級,如果動畫在一個高頻率下運行,則會造成一些別的類似定時器的任務或者類似滑動的其他iOS動畫暫停
  • UITrackingRunLoopMode - 用于UIScrollView和其他空間的動畫
  • 我們可以指定多個run loop mode,同時使用NSDefaultRunLoopModeUITrackingRunLoopMode,可以使動畫不會被滑動打斷,也不會被其他UIKit控件動畫影響性能
    self.timer = [CADisplayLink displayLinkWithTarget:self
                                             selector:@selector(step:)];
    [self.timer addToRunLoop:[NSRunLoop mainRunLoop]
                     forMode:UITrackingRunLoopMode];
    [self.timer addToRunLoop:[NSRunLoop mainRunLoop]
                     forMode:NSDefaultRunLoopMode];

上一篇:iOS Core Animation(七)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容