美文网首页
iOS中的显示动画(属性动画)

iOS中的显示动画(属性动画)

作者: 浪呀么浪打浪 | 来源:发表于2020-07-08 20:28 被阅读0次

    CABasicAnimation

    当更新属性的时候,我们需要设置一个新的事务,并且禁用图层行为。否则动画会发生两次,一个是因为显示的CABasicAnimation,另一个是因为隐式动画。

    动画本身会作为一个参数传入委托的方法,也许你会认为可以控制器中把动画存储为一个属性,然后在回调用比较,但实际上不起作用,因为委托传入的动画参数是原始值的一个深拷贝,从而不是同一个值。CAAnimation实现了KVC协议。但是CAAnimation有一个不同的性能:它更像是一个NSDictionary,可以让你随意设置键值对,即使和你使用的动画所声明的属性并不匹配。

    CAKeyframeAnimation

    CABasicAnimation揭示了大多数隐式动画背后依赖的机制,但是显示的给图层添加CABasicAnimation相较于隐式动画而言,费力不讨好。

    CAKeyframeAnimation同样是CAPropertyAnimation的一个子类,它依然作用于单一的一个属性,但是和CABasicAnimation不一样的是,它不限制于设置一个起始和结束的值,而是可以根据一连串随意的值来做动画。

    CAKeyframeAnimation并不能自动把当前值作为第一帧。动画会在开始的时候突然跳到第一帧的值,然后在动画结束的时候恢复到初始值。

    CAKeyframeAnimation有另一种方式去指定动画,就是使用CGPath。path属性可以用一种直观的方式,使用CoreGraphics函数定义运动序列来绘制动画。可以使用一个三次倍赛尔曲线,它是一种使用开始点,结束点和另外两个控制点来定义形状的曲线。

    虚拟属性

    属性动画实际上是针对于关键路径而不是一个键,这就意味着可以对子属性甚至是虚拟属性做动画。

    为了旋转图层,我们可以对transform.rotation关键路径应用动画,而不是transform本身。

    用transform.rotation而不是transform做动画的好处:

    可以不通过关键帧一步旋转多于180度的动画;

    可以用相对值而不是绝对值旋转;

    可以不用创建CATransform3D,而是使用一个简单的数值来指定角度。

    不会和transform.position或者transform.scale冲突。

    transform.rotation属性其实并不存在。这是因为CATransform3D并不是一个对象,实际上是一个结构体,也没有符合kvc相关属性,transform.rotation实际上是一个CALayer用于处理动画变换的虚拟属性。

    不可以直接设置transform.rotation或transform.scale,他们不能直接使用。当对他们做动画时,CoreAnimation自动地根据通过CAValueFunction来计算的值更新transform属性。

    相关文章

      网友评论

          本文标题:iOS中的显示动画(属性动画)

          本文链接:https://www.haomeiwen.com/subject/xxrpxktx.html