嘿我正在尝试构建一个允许我在屏幕上旋转滚轮的UIGestureRecognizer。想象一下:
必须检测两个手势:转动滚轮并旋转它。 我已经完成了一个UIGestureRecognizer的构建,可以识别转动方向盘,或者转动方向盘。我还能够向滚轮添加UISwipeGestureRecognizer以检测是否发生了旋转手势。但是,我还想要检测一个看起来像这样的手势:
我尝试使用
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return true
}
使它们同时工作,但没有成功。另外我认为只是连接两个描述的GestureRecognizers都不能完成这项工作。
我将不胜感激任何帮助。感谢
答案 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)将运行图层变换的动画来旋转它。