我有一个子图层关键帧动画,用于为沿BSpline的图像设置动画,并与旋转动画组合在一起。将sub-layer.speed设置为0后,我可以根据拖动的距离调整animationsGroup.timeOffset值,沿曲线来回拖动图像。 我想要做的是,在某个阈值(比如%15)之后将动画速度设置为1,这样动画就会自动完成,但事情并非如此简单。动画立即完成并将所有内容重置回起始位置,或者动画到达路径的末尾,循环到零,然后继续动画直到它回到动画开始的位置。
我想要的是:
Tstart - >拖动 - > T0.15 - >动画 - >倾向于
但我得到的是
Tstart - >拖动 - > T0.15 - >动画 - >趋势 - > Tstart - > T0.15
我已经研究了timeOffset和time-warps的使用,并且摆弄了参数,但无济于事。
答案 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"];
}
}