2

我正在制作一部老式手机并获得了一个有效的起始代码,用户将手指移到 UIImageView 数字上并旋转拨号。然后将其移回原始位置。见截图。

在此处输入图像描述

我似乎无法弄清楚的三个问题是;

  1. 如何限制用户只能顺时针旋转?目前用户可以在任何方向(顺时针和逆时针)移动它

  2. 如何检测用户选择了哪个号码?意思是用户触摸了 1 或 3 或 5?我需要此信息,以便在该数字到达右侧栏时停止旋转。

  3. 在我当前的代码中,当我停止旋转并放开圆圈时,它会通过逆时针方向移回原位。如果我选择 1、2、3、4 效果很好,但对于任何数字 5 及以上,表盘顺时针移动回其原始位置。如何在 touchesEnded 上强制逆时针运动?

4

5 回答 5

1

假设您正在谈论这个手势:

转盘 来源


构建单点触控旋转手势识别器。正确构建手势识别器后,您只需查看旋转并了解如何使用旋转垫。

在构建单点触控旋转手势识别器时,您需要考虑几件事。如果您查看UIRotationGestureRecognizer,它使用两个手指支持的两次触摸之间的连接来得出当前角度,然后将该角度与从较早的触摸更改事件得出的前一个角度进行比较,以查看增量。

测量当前角度

形成一条线需要两个点,并且您需要一条线来知道角度。如果您只使用一次触摸,则需要一个锚点。有很多方法可以将锚点发送到手势识别器,并且由于您可能要构建自定义类,请使用委托。

累积旋转计数

如果您只是在触摸更改期间记下角度并发送消息,它有时会起作用。但是,如果您想实现滞后(例如,这个旋转刻度盘只会顺时针旋转一次,然后它会收紧),您需要累积顺时针和逆时针方向的旋转计数。

幸运的是,您可以假设 a) 触摸事件不会太频繁地丢弃,并且 b) 只需将当前角度与过去角度进行比较,看看它们是否跨越象限边界就足够了。

例如:

  • 如果触摸从左上象限移动到右上象限,则将旋转计数加一。
  • 如果触摸从右上象限移动到左上象限,则从旋转计数中减去 1。

(是的,这确实有效。)

发出正确的累积旋转

如果你想像以前一样发出旋转信息UIRotationGestureRecognizer,你将跟踪四件事。

  1. 起始角度:从锚点到起始触摸的连接与从锚点到固定参考点的连接之间的角度。
  2. 当前角度:从锚点到当前触摸的连接与从锚点到固定参考点的连接之间的角度。
  3. Rotation Count:顺时针旋转的次数,通过不断比较当前角度的当前值与其上一个值(如上一节所述)得出。如果触摸逆时针移动,则该计数将变为负数。

您将提供Rotation Count * 2_PI + (Current Angle - Starting Angle)轮换。

于 2012-12-22T08:56:05.033 回答
0

这是一个更好的表盘:

在此处输入图像描述

玩得开心!

于 2012-12-11T20:38:13.370 回答
0

好的,我会采取不同的方法。首先,您要创建一个RotaryDial类来封装所有行为。然后,您可以将其插入您认为合适的任何视图中。

为了简单起见,我会考虑让每个数字按钮成为可移动的 UIImageView,调用它RotaryDialDigit或类似的东西。您将实例化并放置其中的十个。

RotaryDialDigit当用户移动其中一个按钮时,表盘“框架”只会标记骑行。它只是一个图像(除非您希望用户能够触摸它并对其进行操作。

从那里,知道哪个按钮被按下并将其旋转限制在给定方向以及停在酒吧是相当容易的事情。

通过使用协议,您可以让RotaryDial实例在拨打号码时告诉容器。RotaryDial每次按下按钮时,容器都会感觉像键盘发送消息。除了完成的数字选择之外,您真的不希望容器打扰其他任何事情。

于 2012-12-09T18:17:23.947 回答
0

在没有看到您的代码的情况下,我假设这些数字是静态图像,并且当手指孔旋转经过每个数字时,您正在为它们设置动画。如果是这样:

检测哪个数字:在每个按钮周围定义一个 CGRect。当用户点击屏幕时,检查哪个矩形包含点击位置。

控制旋转方向:当用户拖动手指时,连续计算从刻度盘到当前点击位置的角度。如果角度向错误的方向移动,请不要更新指孔的位置。请注意,三角函数返回从 +Pi 到 -Pi 弧度的值。对于大于 5 的数字,您可能希望将 2Pi 弧度(或 360 度)添加到角度,而不是处理负角度。

旋转错误的方式:5以下的数字是在0到-Pi范围内的生成角度。在没有看到代码的情况下,我怀疑将 2Pi 添加到角度会纠正您的旋转方向。

于 2012-12-09T22:42:55.787 回答
0

要检测哪个数字被触摸,当您创建每个数字时,您应该设置tag其 UIView 的值。然后,当用户触摸该数字时,您可以通过检查该标签值来检测它是哪个 UIView 对象。

对于旋转问题,我建议看看你是如何计算角度的。我猜我会说对于大于 4 的数字(你可以从标签中看出),你需要做一些事情,比如从 360 度(以及 2Pi)中减去你当前计算的角度。(但我现在有点感冒,所以实际的数学正在逃避我:-))

于 2012-12-09T19:21:25.873 回答