【问题标题】:rotary dial - rotation limitation旋转拨盘 - 旋转限制
【发布时间】:2012-12-09 17:55:45
【问题描述】:

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

我似乎想不通的三个问题是;

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

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

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

【问题讨论】:

  • 顺便说一下,在标准的美国非紧凑型旋转电话上,数字以 1/12 圈的增量定位,在旋转开始时留下 2 个数字位置空。
  • @Sam Budda 你能不能把你在上面所说的问题提供给我这个代码。我需要使用相同的功能。

标签: iphone ios ipad


【解决方案1】:

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

Source.


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

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

测量当前角度

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

累积旋转次数

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

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

例如:

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

(是的,这确实有效。)

发出正确的累积旋转

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

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

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

【讨论】:

    【解决方案2】:

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

    为了简单起见,我会考虑将每个数字按钮设为可移动的 UIImageView,将其命名为 RotaryDialDigit 或类似名称。您将实例化并放置其中的十个。

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

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

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

    【讨论】:

    • 对不起伙计,这比我需要的要复杂得多。我知道给猫剥皮的方法有数百种,而这只是一种方法。
    • 实际上,这是相当简单的东西。但是,当然,你可以用一百万种不同的方式来做到这一点。没关系。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

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

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

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

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

      【讨论】:

      • 当旋转角度大于 pi 时,您需要分两步完成,否则旋转会倒退。
      • 旋转角度让我很伤心请检查我的另一个有示例代码的问题,看看你是否能弄清楚stackoverflow.com/questions/13791582/…
      【解决方案5】:

      这是一个更好的表盘:

      玩得开心!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-13
        • 2014-10-08
        • 1970-01-01
        • 1970-01-01
        • 2016-03-02
        • 1970-01-01
        相关资源
        最近更新 更多