从非零时间开始CAKeyframeAnimation

时间:2013-03-25 01:53:52

标签: calayer cakeyframeanimation

我有一个子图层关键帧动画,用于为沿BSpline的图像设置动画,并与旋转动画组合在一起。将sub-layer.speed设置为0后,我可以根据拖动的距离调整animationsGroup.timeOffset值,沿曲线来回拖动图像。 我想要做的是,在某个阈值(比如%15)之后将动画速度设置为1,这样动画就会自动完成,但事情并非如此简单。动画立即完成并将所有内容重置回起始位置,或者动画到达路径的末尾,循环到零,然后继续动画直到它回到动画开始的位置。

我想要的是:

Tstart - >拖动 - > T0.15 - >动画 - >倾向于

但我得到的是

Tstart - >拖动 - > T0.15 - >动画 - >趋势 - > Tstart - > T0.15

我已经研究了timeOffset和time-warps的使用,并且摆弄了参数,但无济于事。

1 个答案:

答案 0 :(得分:0)

通过将动画组包装在一个持续时间为动画组持续时间的0.85倍的新动画组中,可以获得该结果。这里有一些代码可以做到这一点:

- (void) setTimeOffset:(double)value
{
    if (value < 0.15) {

        // This is what you are already doing.
        _animGroup.timeOffset = value;
        [_someSublayer addAnimation:_animGroup forKey:@"animGroup"];

    } else if (_animGroup.speed == 0.0) {

        // You must set the final position before animating otherwise the 
        // layer will come back to it's original position.

        _someSublayer.position = _theEndPointOfYourPath;

        // Now set the speed of the animation group to 1 so that it animates.
        // Be sure to leave the timeOffset alone so that is starts where you want it.

        _animGroup.speed = 1.0;

        // Create a new animation group around it whose duration is the remaining time
        // of the animation group and add that to the layer instead. It will prevent
        // animGroup from wrapping.

        CAAnimationGroup *outerGroup = [[CAAnimationGroup alloc] init];
        outerGroup.animations = @[_animGroup];
        outerGroup.duration = _animGroup.duration - _animGroup.timeOffset;

        [_someSublayer addAnimation:outerGroup forKey:@"animGroup"];
    }    
}