使用负速度恢复CABasicAnimation?

时间:2016-03-31 15:49:45

标签: ios objective-c xcode uiview calayer

我使用以下代码恢复了我的CABasicAnimation:

    CFTimeInterval pausedtime = layer.timeOffset;
    layer.speed = 1.0;
    layer.timeOffset = 0.0;
    layer.beginTime = [layer convertTime:CACurrentMediaTime() toLayer:nil] - pausedTime;

这非常简单。在this文章的最后,作者指出负值speed值动画反转。在这种情况下,我无法理解timeOffsetbeginTime应该是什么样的?

P.S。我知道我可以通过从表示层获取当前值并设置为Value和fromValue来反转动画。我想知道是否可以使用speed属性。

1 个答案:

答案 0 :(得分:0)

使用.timeOffset = 0向后恢复动画会遇到问题。 .timeOffset = 0表示动画在开始时。因此,以反向速度动画将立即完成。因此,例如,如果您拥有动画,动画会在完成时自动删除-它不会播放任何内容:只会消失。

CAAnimation的文档确实不完善。他们的恢复示例仅使用.beginTime属性。我们可以改用.timeOffset属性。

1。将图层的开始时间设置为其容器的当前时间:

// set begin time to current time of superlayer to start immediately
let sTime = layer.superlayer?.convertTime(CACurrentMediaTime(), to: nil) ?? 0
layer.beginTime = sTime

2。使用.timeOffset转到动画要恢复的时刻:

// set starting point of animation to the current "progress"
layer.timeOffset = progress

progress是您要从动画持续时间恢复的时间位置。也就是说,如果动画持续时间为0.6,则0 ≤ progress ≤ 0.6

3。反向启动动画:

// set negative speed to have reverse animation
layer.speed = -1.0

如果需要的话,请不要忘记删除动画。

这是实际上如何应用这些设置的图片:

CALayer timing with reverse speed explained.