0

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

我想要的是:

Tstart -> 拖动 -> T0.15 -> 动画 -> Tend

但我得到的是

Tstart -> 拖动 -> T0.15 -> 动画 -> Tend -> Tstart -> T0.15

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

4

1 回答 1

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"];
    }    
}
于 2013-04-13T20:29:34.387 回答