如何覆盖 ios 中的 VoiceOver 手势?

How can I override VoiceOver gestures in ios?

我正在为盲人开发一个包含地图的应用程序。当 VoiceOver 关闭时,我可以使用 UIGestureRecognizer 检测滑动和双击手势。例如:

UISwipeGestureRecognizer * swipeLeft=[[UISwipeGestureRecognizer alloc]initWithTarget:self action:@selector(swipeLeft:)];
swipeLeft.direction=UISwipeGestureRecognizerDirectionLeft;
[self.view addGestureRecognizer:swipeLeft];

但是,当 VoiceOver 打开时,我无法覆盖我现有的 VoiceOver 手势。我知道 UIAccessibilityTraits 允许直接交互的可能性:

[mySubView setAccessibilityTraits: UIAccessibilityTraitAllowsDirectInteraction];

问题是因为我有地图,当我允许直接交互时,我开始与地图交互(平移、缩放等)。但是,我的目标是保持地图原样,但通过 GestureRecognizers 检测手势并执行与它们相关联的操作。

关于如何做到这一点有什么想法吗?

VoiceOver 的直接交互模型支持手势识别器。您观察到的是与地图手势处理的冲突。鉴于地图视图及其触摸处理的复杂性,我鼓励采用两种替代方法之一。在这两种情况下,您可能都希望在地图视图上方叠加透明 UIView

  1. 将任何手势识别器附加到此自定义视图。用户可以通过直接交互触发快捷方式。您可能希望在 VoiceOver 运行.
  2. 上对此进行调节
  3. 完全回避直接交互并在地图或叠加视图上将您的快捷方式实现为 custom actions。这可能会使其他辅助功能的用户受益,而不仅仅是 VoiceOver。

是的,我通过附加子视图并设置“.isAccessibilityElement = true”和“.accessibilityTraits = .allowsDirectInteraction”并将所有手势和覆盖触摸方法引用到添加的视图来解决这个问题。