Iphone 如何沿弯曲路径拖动、投掷、设置视图动画

Iphone 如何沿弯曲路径拖动、投掷、设置视图动画,iphone,cocoa,cocoa-touch,core-animation,Iphone,Cocoa,Cocoa Touch,Core Animation,我有一个基于视图的iPhone应用程序。目前,屏幕左上角有一个小图像。当用户轻触屏幕时,将使用CAKeyframeAnimation沿屏幕右下角的曲线路径为图像设置动画 现在我想更改应用程序,以便用户可以沿动画路径拖动图像,而不是在点击事件上设置动画。基本上,当用户向右拖动时,动画向前移动;当用户向上拖动或向左拖动时,动画向后移动。在触摸结束事件中,我希望图像继续沿拖动方向的路径设置动画 我知道如何读取拖动事件,但我不知道如何启动/停止/恢复动画或跳到动画中的特定阶段。似乎我需要重新开始,并使用

我有一个基于视图的iPhone应用程序。目前,屏幕左上角有一个小图像。当用户轻触屏幕时,将使用CAKeyframeAnimation沿屏幕右下角的曲线路径为图像设置动画

现在我想更改应用程序,以便用户可以沿动画路径拖动图像,而不是在点击事件上设置动画。基本上,当用户向右拖动时,动画向前移动;当用户向上拖动或向左拖动时,动画向后移动。在触摸结束事件中,我希望图像继续沿拖动方向的路径设置动画

我知道如何读取拖动事件,但我不知道如何启动/停止/恢复动画或跳到动画中的特定阶段。似乎我需要重新开始,并使用CAKeyframeAnimation以外的其他东西。如果是这样,我应该如何重新开始


非常感谢

不幸的是,没有办法设置一个中途启动的CAAnimation


您需要在用户拖动时沿路径手动移动图像,然后在用户完成拖动后使用剩余路径创建新的动画。

标记F是正确的。我在做游戏的时候也遇到过类似的问题。我想从动画暂停的位置重新启动动画

我能想到的最简单的解决方案是捕获开始时间:

    mStartTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];
然后,当动画停止时,获取停止时间并计算偏移:

    CFTimeInterval stopTime = [layer convertTime:CACurrentMediaTime() fromLayer:nil];;
    mTimeOffset += stopTime - mStartTime;
使用
mTimeOffset
,我将计算一组不同的关键时间:

- (NSArray *)keyTimesWithOffsetTime:(CFTimeInterval)offsetTime;
基于此,我将为动画获得不同的开始帧。“帧”是指关键帧动画的任何片段

这样做有点痛苦,但确实有效。我很想知道使用cocos2d的游戏是如何处理暂停和恢复的。必须有一个更简单的方法

关于沿路径的动画,看起来您的动画运行正常。如果没有,请查看本教程:


最后,我将动画作为一个函数重新编写,以便在时间和拖动位置之间交换输入。时间和拖动位置是标量,并按比例适当匹配。请参阅CAAnimation的
timeOffset
属性