作为一个起点,你可能想要做的是跟踪用户滚动的轮子数量。当用户开始触摸车轮时,保存日期和当前角度
NSDate *lastDate = [NSDate date];
double lastAngle = //however you're determining the wheel angle
然后在每个touchMoved上,用当前时间和角度更新这些值。当你最终能touchEnded,获得自上次保存日期的时间间隔,并用它来确定车轮的转速:
NSDate *currentDate = [NSDate date];
NSTimeInterval elapsedTime = [currentDate timeIntervalSinceDate];
double rotationalSpeed = (currentAngle - lastAngle)/elapsedTime;
现在你有角/秒,该轮可根据用户的旋转手指。目标是保持相同的速度,所以也许只需启动一个计时器,该计时器可以每秒发射一小部分,并将车轮旋转至rotationSpeed * timeElapsedSinceLastTimerFired。通过保存实际的日期来计算最后的计时器启动方法,类似于您如何跟踪上述轮子角度更新之间的时间。或者,您可以在角度更新之间有更长的时间间隔,并随着时间的推移对旋转进行动画处理。当你的短动画完成后,你就从另一个开始。
那些将保持车轮无限期地以用户的最后速度转动。为了缩小它,你可能只需要一个计时器,每隔0.1秒发射一次,或者降低旋转速度直到零或零。更好的是,如何存储用户放开轮子的日期,然后根据用户停止互动后的时间长短来应用一部分rotationSpeed。例如:
CGFloat secondsUntilWheelShouldStop = 5;
NSTimeInterval intervalSinceUserStopped = [[NSDate date] timeIntervalSinceDate:userStoppedDate];
// Determine fraction of secondsUntilWheelShouldStop that's elapsed
CGFloat portionOfCooldownTimeElapsed = intervalSinceUserStopped/secondsUntilWheelShouldStop;
if (portionOfCooldownTimeElapsed >= 1.0) {
// Time has run out, so call your method to round to nearest "snap-to" angle or something and end.
[self snapWheelRotation];
} else {
// Rotate the wheel by the appropriate fraction of rotationalSpeed
double angleToRotate = (portionOfCooldownTimeElapsed * rotationalSpeed) * elapsedTimeSinceLastUpdate;
[self rotateWheelByAngle:angleToRotate];
}
当您停止车轮时,只需确定最近的捕捉点是什么,然后将车轮设置为该位置的动画。你应该添加东西touchesBegan基本结束所有这些定时器和动画时,用户也接触轮子,所以它不动画下面。
我不确定这是否是最优雅的解决方案,但如果我试图解决问题的话,我会开始这样做。祝你好运!
你是怎么做到的? :) – rkj 2011-12-02 13:14:15