关于objective C:iPhone 添加惯性/动量物理来动画”命运之轮”,如旋转控制

iPhone add inertia/momentum physics to animate "wheel of fortune" like rotating control

我正在尝试创建一种新的旋转控件,其外观和感觉就像一个真正的大轮子支撑在一个销上,能够以一定程度的阻尼围绕它的中心点旋转,这将最终使车轮停下来。想想"命运之轮"。

Example

旋转控制示例项目

当使用原生 UITableView 和/或 UIScrollView 时,它们可以在一个方向上"轻弹"并继续在该方向上滚动一段时间。我知道动画曲线可以达到类似的效果。

我感兴趣的是如何根据手指移动的距离/速度计算界面元素应该滚动/旋转的距离。不同类型的"轻弹"通过将"动量"转移到轮子上会产生不同的行为。任何人都可以提出这种计算的例子吗?

我对将相同的惯性概念应用于自定义旋转控件特别感兴趣,如下所述:堆栈溢出时的旋转控件。当前的示例,甚至示例中提到的 convertbot 应用程序都没有使用惯性。滚轮简单地跟随手指并捕捉到预定义的位置。我想让一个类似的轮子感觉它有真正的质量,所以它可以轻弹并以可预测的方式旋转,直到平稳停止。 (想想"命运之轮"式显示)。

我怎样才能为旋转控件实现这种基于惯性的"命运之轮"行为,让控件感觉像是拥有真正的质量?

谢谢!


实现一个完全真实的质量效果并不是那么简单,而且可能需要太多的工作(尤其是对于这样一个简单的任务),因此我会忽略物理定律(除了那些严格需要的)并让一切变得更简单.

动量是 r x F,其中 r 是半径,F 是施加的力。由于它取决于半径,因此您离车轮中心越远,动量就越大。让我们忽略它并假设力是相切的并且总是在 r=wheelWidth/2 处施加。

此外,您可以简单地使其取决于手势的速度,而不是计算力(比计算力更容易,因为它需要质量和加速度)。因此,我们可以想象更快的触摸将对应更大的动量。

当然,手势永远不会是完全水平或垂直的,因此您可以假设每次都施加两个扭矩:第一个对应于垂直运动,第二个对应于水平运动。

您可以获得手势速度,您可以简单地计算触摸的初始位置和最终位置,然后将它们的差除以经过的时间。

要获得减速效果,您必须假设,当车轮移动时,始终存在相反的扭矩。您可以在编译时定义它或使其取决于轮子的宽度(这样较大的轮子会更快地减速)。

现在你几乎拥有了你所需要的一切......祝你好运:)


我发现使用 iCarousel,可以创建一个带有惯性/动量的轮状控件!