我想做一个车轮风格的菜单,允许用户旋转车轮(一个UIImageView)来查看各种选项。在车轮的上半部分,也有一个选择指示器,用户可以通过拖动所需的选项在车轮周围并在选择指示器下的位置来选择一个特定的选项(就像使用UIPickerView时一样)。
遵循SO后iPhone - How to build a roulette like wheel?,我已经能够实现一个车轮,跟踪用户接触和旋转车轮相应。然而,我需要两个额外的功能:
。
我不知道如何实现这些功能,因此,任何援助都将不胜感激。
发布于 2010-11-21 07:42:10
作为一个起点,您可能想要做的是跟踪用户已经滚动了多少车轮。当用户开始接触车轮时,将日期和当前角度保存为
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;现在,您有一个角度/秒,即车轮在用户手指下旋转。我们的目标是保持同样的速度,所以也许只需启动一个计时器,它每隔一秒就触发一次,并将车轮旋转到rotationalSpeed * timeElapsedSinceLastTimerFired。通过保存计时器触发方法的实际日期来计算最后一个时间,该方法类似于您如何跟踪上述轮角更新之间的时间。或者,您可以有更长的间隔之间的角度更新,并动画旋转随着时间的推移。当你的短动画完成后,你只需开始另一个。
这将使车轮无限期地以用户的最后速度转动。为了缩小它,您只需要一个计时器,它可能每0.1秒启动一次,并将rotationalSpeed降低到零下或零下。更好的是,如何存储用户释放的日期,然后根据用户停止交互的时间来应用rotationalSpeed的一部分。类似于:
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,基本上结束所有这些计时器和动画,当用户触摸车轮以及,所以它不动画在他们下面。
我不确定这是否是最优雅的解决方案,但如果我试图解决这个问题,我会从这里开始。祝好运!
https://stackoverflow.com/questions/4236627
复制相似问题