首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >轮式iPhone菜单

轮式iPhone菜单
EN

Stack Overflow用户
提问于 2010-11-21 05:47:27
回答 1查看 2.8K关注 0票数 1

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

遵循SO后iPhone - How to build a roulette like wheel?,我已经能够实现一个车轮,跟踪用户接触和旋转车轮相应。然而,我需要两个额外的功能:

  1. 实现了惯性滚动,这样用户就可以在车轮上滑动,然后旋转,优雅地减速/减速,有点像“财富之轮”游戏秀上的车轮。
  2. 当车轮完成减速并完全停止时,它将自动停止其中一个选项,从而在选择指示器(如UIPickerView)下面出现一个单一选项,而不是可能将两个选项都放在选择指示器下。

我不知道如何实现这些功能,因此,任何援助都将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-21 07:42:10

作为一个起点,您可能想要做的是跟踪用户已经滚动了多少车轮。当用户开始接触车轮时,将日期和当前角度保存为

代码语言:javascript
复制
NSDate *lastDate = [NSDate date];
double lastAngle = //however you're determining the wheel angle

然后在每个touchMoved上,用当前的时间和角度更新这些值。当您最终到达touchEnded时,获取上次保存日期后的时间间隔,并使用该时间间隔来确定车轮的转速:

代码语言:javascript
复制
NSDate *currentDate = [NSDate date];
NSTimeInterval elapsedTime = [currentDate timeIntervalSinceDate];
double rotationalSpeed = (currentAngle - lastAngle) / elapsedTime;

现在,您有一个角度/秒,即车轮在用户手指下旋转。我们的目标是保持同样的速度,所以也许只需启动一个计时器,它每隔一秒就触发一次,并将车轮旋转到rotationalSpeed * timeElapsedSinceLastTimerFired。通过保存计时器触发方法的实际日期来计算最后一个时间,该方法类似于您如何跟踪上述轮角更新之间的时间。或者,您可以有更长的间隔之间的角度更新,并动画旋转随着时间的推移。当你的短动画完成后,你只需开始另一个。

这将使车轮无限期地以用户的最后速度转动。为了缩小它,您只需要一个计时器,它可能每0.1秒启动一次,并将rotationalSpeed降低到零下或零下。更好的是,如何存储用户释放的日期,然后根据用户停止交互的时间来应用rotationalSpeed的一部分。类似于:

代码语言:javascript
复制
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,基本上结束所有这些计时器和动画,当用户触摸车轮以及,所以它不动画在他们下面。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4236627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档