欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

iOS Core Animation(八)- 缓冲

程序员文章站 2024-03-24 23:31:46
...
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(七)