如何修改触摸和拖动灵敏度?

时间:2013-03-23 17:49:12

标签: ios

我正在为一个身体残疾的人群开发应用程序,在测试中我们发现他们在默认的触摸拖动功能方面遇到了很多麻烦。

我们有一个屏幕,其中有一个UIScrollView中的图标网格。您可以触摸图标将其激活,您可以触摸拖动网格中的任何位置,包括图标,滚动网格并查看更多图标。

在iOS中,默认行为是您在一个动作中触摸并拖动。这需要一定程度的物理协调,如果您触摸并暂停并然后拖动,或拖一点偏离航线,系统会将此视为一种简单的触摸。所以我们的测试人员正在做的事情如下:

  • 触摸,暂停片刻,然后尝试拖动。网格不滚动。如果他们试图通过拖动图标来滚动,当他们释放触摸时,它会激活图标。

  • 触摸,尝试垂直拖动(唯一支持的方向),但首先水平转向一点点。与上述结果相同。

所以问题是:有没有办法覆盖触摸处理以建立更慢的缓慢或拖动不准确的容忍度,以便应用程序能够正确地将上述操作解释为滚动请求?

5 个答案:

答案 0 :(得分:3)

首先,完全阅读this guide,(如果需要,两次或三次),以便了解如何构建UIkit的触摸机制。它涉及用户认为是touch的内容,事件如何与底层硬件交互,所有对象拦截它的内容,以及如何根据需要调整现有UIkit触摸界面,至少在概念上如此。

引起我注意的不容错过的是this,尤其是timestampphasepreviousLocationInView等属性。 (我只提到不太受欢迎的那些)。

最后,我不知道,但你最终可以根据自己的需要量身定做creating your own custom gesture recognizer

<强>更新

虽然与要求不太相关,this对初学者来说是个好开始。

答案 1 :(得分:3)

您应该使用UILongPressGestureRecognizer(http://developer.apple.com/library/ios/#documentation/uikit/reference/UILongPressGestureRecognizer_Class/Reference/Reference.html),并且:

  • 将minimumPressDuration设置为非常短的(例如10)
  • 将allowableMovement设置为非常大的(例如500)

...现在你有一个“宽容”的手势,对于摇摆不定的人,我已经在几个针对学龄前儿童/幼儿的应用程序中使用了这个,并且效果非常好。

Re:滚动逻辑,UIScrollView易于以编程方式控制 - 如果您阅读UIScrollView和所有“委托”类的文档,您应该找到通过UILongPressGestureRecognizer手势回调“控制”它所需的一切。

注意:您不需要编写任何自定义的GestureRecognizer - 苹果的UILongPressGestureRecognizer会为您完成所有工作,并在手势移动时为您提供回调;你只需回应。

答案 2 :(得分:1)

有许多方法可以在没有子类化的情况下自定义手势识别的行为。

可能适合某些人群的快捷方法是让用户在设置&gt;常规&gt;辅助功能&gt; AssistiveTouch 中配置自定义手势。通过这种方式,例如,可以记录垂直平移,可以通过点击辅助触摸菜单来启用。

其他人假设您需要更多控制权。

查看 requireGestureRecognizerToFail :此方法允许您在不进行子类化的情况下确定手势识别器的优先级,以便例如在识别点击之前平移手势必须失败。

滚动视图的手势识别器可作为UIScrollView上的属性访问。您可能还想实现 UIGestureRecognizerDelegate 。您可以使用以下三种方法中的任何一种调整行为: gestureRecognizerShouldBegin :, gestureRecognizer:shouldReceiveTouch :和 gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer :.

另一种需要考虑的方法是自定义每个手势所需的触摸次数。将任一手势的最小值设置为2将确保在只有一次触摸时仅调用其他识别器。

对于非常低级别的控制,您可以将UIApplication或UIWindow子类化为拦截触摸传递到手势识别器。

鉴于您定位的人口可能没有相同的功能,我建议您使用偏好设置配置这些调整,以允许它们与用户匹配。这应该是在系统级别设置的一组全局首选项,可能在我上面提到的辅助功能首选项中,所以我建议您向Apple提交一个错误,确定需要进行哪些调整,以及您可以提供的任何参考信息。

答案 3 :(得分:0)

你当然可以使用自定义触摸手势识别器并捕捉触摸手势识别器代理方法,如touchDidBegin或shouldRecieveTouch,这样的东西,我不记得他们的确切措辞。只需查找自定义触摸手势识别器和触摸手势识别器代表即可。

答案 4 :(得分:0)

事实证明,默认UIScrollView滚动是正确的,但问题只是如果用户触摸按钮,按钮会获得触摸事件,不会< / strong> ScrollView,这让我搞砸了。

所以我遇到的这个问题的解决方案是禁用按钮,然后ScrollView接收到触摸。然后,我使用UIScrollView的自定义子类,在其中实现TouchesBeganTouchesEnded方法。在这些方法中,我记录了用户向下和向上触摸的位置,如果它们彼此接近并且通过(禁用)按钮,则我执行该按钮所执行的操作。

这完美无缺,但我认为这肯定比需要更多的工作。所以也许我的问题应该是:是否有办法让按钮保持启用状态,以便滚动视图在其子视图之前获取触摸事件,根据需要滚动,然后将事件中继到子视图?