【问题标题】:iOS/Swift: Custom UIGestureRecognizer that detect spin motioniOS/Swift:检测旋转运动的自定义 UIGestureRecognizer
【发布时间】:2016-10-12 20:05:54
【问题描述】:

嘿,我正在尝试构建一个 UIGestureRecognizer,它允许我在屏幕上旋转一个轮子。想象一下:

必须检测两个手势:转动滚轮和旋转它。 换句话说,我已经完成了一个 UIGestureRecognizer 的构建,它可以识别转动或旋转它。我还可以将 UISwipeGestureRecognizer 添加到轮子以检测是否发生了旋转手势。但是,我还希望检测到如下所示的手势:

  1. 用户通过在屏幕上平移来旋转滚轮
  2. 平移后,手指仍然放在屏幕上,快速滑动并移开屏幕手指,这样滚轮就会旋转

我尝试过使用

public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }

让它们同时工作,但没有成功。此外,我认为仅仅连接两个描述的 GestureRecognizers 并不能完成这项工作。

我将不胜感激。谢谢

【问题讨论】:

  • 能分享一下旋转的代码吗?

标签: ios swift uigesturerecognizer


【解决方案1】:

您的问题将是当平移开始时,它将继续被识别为平移手势,直到触摸结束。因此,您需要计算的是平移结束时的速度,如果您想变得更漂亮,请将该速度从相对于视图中心的点投影到垂直向量上。这将涉及一些三角函数,我完全忘记了,但它看起来像这样。

func pan(_ sender: UIPanGestureRecognizer) {
        ...

     if sender.state == .ended {
        let loc = sender.location(in: sender.view)
        let midpoint = CGPoint(x: sender.view!.bounds.width/2, y: sender.view!.bounds.height/2)
        let v = sender.velocity(in: sender.view)
        let p = CGPoint(x: midpoint.x - loc.x, y: midpoint.y - loc.y)

        let angle = atan(p.y/p.x)
        print(angle)
        let vProjection = v.y * cos((CGFloat.pi/2 - angle)) + v.x * cos(angle)
        print("moment: ", vProjection)

        let torque = p.hypotenuse() * vProjection
        wheel.rotate(with: torque)
    }
}

extension CGPoint {
    func hypotenuse() -> CGFloat {
        return sqrt(self.x * self.x + self.y * self.y)
    }
}

我认为我的三角函数存在错误。我必须画一些图表,但它给出了总体思路。 wheel.rotate(with torque: CGFloat) 将运行图层变换的动画来旋转它..

【讨论】:

  • 虽然这些值还不是很正确,但这已经很好了。这个想法很棒。非常感谢!
  • 你可能只需要速度就可以了。我没有检查数字,只是用我有限的代数写下来。很高兴它正在工作!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-02
相关资源
最近更新 更多