如何通过手势识别器检测圆形手势?

12

我正在尝试实现一个类似音量控制的圆形按钮。目前我可以通过手势识别器检测滑动手势。请问如何在按钮上检测圆形手势(顺时针和逆时针)?谢谢!

4个回答

15

你是在寻找单触手势(如圆形滑块),还是双触手势(如抓住并旋转真实世界的旋钮)?如果是后者,请看看 UIRotationGestureRecognizer

如果是前者,你基本上要自己去解决。你可以将你的解决方案实现为你自己的自定义手势识别器:这是苹果所预期的,并且有一些文档可供参考(尽管我很少见到工作示例)。还可以查看如何正确地子类化UIGestureRecognizer

作为一般性的方法,我认为手势的区域应该是一个甜甜圈形状:中心点为c,内半径为r1,外半径为r2的区域。当用户按下时,你可以使用勾股定理计算与c之间的距离,以及用你最喜欢的三角函数计算出角度。有了这个,你就可以确定触摸是否在区域内。当用户拖动时,你可以根据角度更新控件值。某些时候,他们会抬起手指,或者拖出区域,手势就结束了。我建议允许触摸在r1内部或r2外部偏离得相当远:手指是不精确的工具。


一个单触手势(例如圆形滑块)。 - ohho
1
我非常喜欢甜甜圈解决方案!! :D - user90843
1
我已经创建了自己的子类,任何人都可以查看,但是如果你发现有遗漏或者可以改进,请务必贡献代码,这是一项开源项目! https://bitbucket.org/danielphillips/dpcirculargesturerecognizer - Daniel
2
@Daniel,我在我的应用程序中使用了KTOneFingerRotationGestureRecognizer - ohho
我正在使用平移手势识别器实现自己的解决方案。以下是步骤:1)记录起始触摸位置。2)从手势期间所有触摸计算平均触摸位置。3)记录结束手指位置。结果是一个三角形,其中一条边从起始触摸到结束触摸。指向平均触摸的方向表示旋转中心的方向。我将在该线的一侧找到最近的有效点。该侧还表示旋转方向。 - Victor Engel
显示剩余5条评论

7

我无法找到解决办法,但是在受到 @sixten 回答的启发后,我创建了一些有用的东西。它不是百分之百可靠,但目前看来可以满足我的需求。

请任何人都可以 fork、clone 或使用这个开源项目,并加以改进。以下是我的代码库链接:

https://bitbucket.org/danielphillips/dpcirculargesturerecognizer


1
嗨,丹尼尔,感谢你提供的代码。为了方便管理,如果能够包含一个许可证文件或者在代码中加入许可证信息就更好了。 - Farski
@Daniel - 太棒了,我刚刚尝试了一下,完全没问题!:) - sabiland

0
你试过自己编写手势识别器吗?文档中有详细的说明。

0

最好的方法是实现自定义手势识别器。我不知道您是否希望检测离散手势(事件处理方法将在检测到完整圆形后调用)还是连续手势(每次在圆形路径上移动手指时都会调用事件处理方法)。

可能,用户可能无法画出完美的圆形,@Sixten Otto提供的解决方案可能很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接