2010-11-21 44 views
1

我想制作一个轮式菜单,它允许用户旋转轮子(一个UIImageView)来查看各种选项。在轮子的上半部分还有一个选择指示器,用户可以通过在轮子周围拖动所需选项并在选择指示器下方定位来选择特定选项(就像使用UIPickerView时一样)。轮式iPhone菜单

继SO帖子iPhone - How to build a roulette like wheel?我已经能够实现跟踪用户触摸并相应地旋转车轮的车轮。不过,我需要两个额外的功能:

  1. 实现惯性滚动,使用户可以做到在车轮上刷卡并绕优雅地减慢/减速,有点像上了“轮轮财富“游戏节目。

  2. 当车轮完成减速并达到完全停止时,它会自动停止其中一个选项,以便在选择指示符(如UIPickerView)下面出现单个选项,而不是可能有两个选项一半在选择指标下。

我不确定如何去实现这些功能,所以任何援助将不胜感激。

+0

你是怎么做到的? :) – rkj 2011-12-02 13:14:15

回答

2

作为一个起点,你可能想要做的是跟踪用户滚动的轮子数量。当用户开始触摸车轮时,保存日期和当前角度

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基本结束所有这些定时器和动画时,用户也接触轮子,所以它不动画下面。

我不确定这是否是最优雅的解决方案,但如果我试图解决问题的话,我会开始这样做。祝你好运!

+0

谢谢atticus。这给了我一些很好的信息来思考。 – Skoota 2010-11-23 09:15:43