iOS / Swift:自定义UIGestureRecognizer,用于检测旋转运动

时间:2016-10-12 20:05:55

标签: ios swift uigesturerecognizer

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

enter image description here

必须检测两个手势:转动滚轮并旋转它。 我已经完成了一个UIGestureRecognizer的构建,可以识别转动方向盘,或者转动方向盘。我还能够向滚轮添加UISwipeGestureRecognizer以检测是否发生了旋转手势。但是,我还想要检测一个看起来像这样的手势:

  1. 用户通过在屏幕上平移来旋转滚轮
  2. 平移后,仍然用手指在屏幕上,快速滑动并移开屏幕的手指,以便车轮旋转
  3. 我尝试使用

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

    使它们同时工作,但没有成功。另外我认为只是连接两个描述的GestureRecognizers都不能完成这项工作。

    我将不胜感激任何帮助。感谢

1 个答案:

答案 0 :(得分:2)

问题是,当平移启动时,它将继续被识别为平移手势,直到触摸结束。所以你需要弄清楚的是当平底锅结束时的速度,如果你想变得更加漂亮,那么将该速度从相对于视图中心的点投射到垂直向量上。这将涉及一些三角函数,我忘了它,但它看起来像这样。

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(带扭矩:CGFloat)将运行图层变换的动画来旋转它。