10

我正在为残障人士开发一款应用程序,在测试中我们发现他们在使用默认的触摸拖动功能时遇到了很多问题。

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

在 iOS 中,默认行为是您在一个动作中触摸并拖动。这需要一定程度的身体协调,如果您触摸并暂停然后拖动,或者稍微偏离路线,系统会将其视为简单触摸。所以我们的测试人员正在做这样的事情:

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

  • 触摸,尝试垂直拖动(唯一支持的方向),但先水平转向一点。结果和上面一样。

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

4

5 回答 5

3

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

引起我注意的一点你也不能错过,尤其是像timestamp,phasepreviousLocationInView. (我只提到那些不是很受欢迎的)。

最后,我不知道,但您最终可以创建自己的自定义手势识别器,该识别器将根据您的需求量身定制。

更新:

虽然与要求不太相关,但这对于初学者来说是一个好的开始。

于 2013-03-23T18:16:19.923 回答
3

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

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

......现在你有了一个对摇摆不定的按压等“宽容”的手势。我已经在几个针对学龄前儿童/幼儿的应用程序中使用了它,而且效果很好。

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

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

于 2013-04-03T16:42:54.737 回答
1

有许多方法可以自定义手势识别的行为而无需子类化。

一种可能适合某些人群的快速方法是让用户在Settings>General>Accessibility>AssistiveTouch中配置自定义手势。以这种方式,例如,可以记录垂直平移,当启用时,可以通过点击辅助触摸菜单来使用该平移。

其余的假设你想要更多的控制权。

看看requireGestureRecognizerToFail :. 此方法将允许您优先处理手势识别器,而无需子类化,因此,例如,平移手势必须在识别点击之前失败。

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

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

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

鉴于您的目标人群可能没有相同的能力,我建议使用首选项设置来配置这些调整,以使它们与用户匹配。这实际上应该是在系统级别设置的一组全局首选项,可能在我上面提到的辅助功能首选项中,所以我鼓励您向 Apple 提交一个错误,准确列出需要哪些调整,以及您可以提供的任何参考信息.

于 2013-04-06T04:46:16.523 回答
0

您当然可以使用自定义触摸手势识别器并捕获触摸手势识别器委托方法,例如 touchDidBegin 或 shouldRecieveTouch,诸如此类的东西,我不记得它们的确切措辞。只需查找自定义触摸手势识别器和触摸手势识别器委托。

于 2013-03-23T18:01:04.570 回答
0

事实证明,默认UIScrollView滚动是正确的,但问题很简单,如果用户触摸按钮,按钮会获得触摸事件,而不是ScrollView,这让我很困惑。

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

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

于 2013-04-08T13:34:03.437 回答