在自定义视图上处理来自 VoiceOver 的 "tap"

Handle a "tap" from VoiceOver on a custom view

我正在审查我们的应用程序以使其更易于访问,但我对自定义视图有疑问。注意:我使用的是 Xamarin/C#,但希望这不会改变任何东西,因为它在后台使用相同的 API。

这个自定义视图基本上模仿了 "slide to unlock" 手势。这当然不适用于 VoiceOver,因为当启用它时,用户不能 "slide",只能双击激活 view/button。

视图为 UIView 子class,由子 UIVIew 和一个从左到右捕捉手势的 UIPanGestureRecognizer 组成。

我首先向父项添加辅助功能信息 class:

IsAccessibilityElement = true;
AccessibilityTraits = UIAccessibilityTrait.Button;
AccessibilityLabel = "...";

VoiceOver 现在可以正确地将滑块视为一个视图,而不是检查子视图。但是,我无法使用 "VoiceOver double tap" 手势激活它。

我尝试使用子classing UIControl 代替 UIView 并覆盖 sendAction(),但未调用此方法。

我不想为控件设置 UIAccessibilityTraitAllowsDirectInteraction 特性,因为这不利于呈现应用程序的可访问性。

我该怎么做才能捕捉到 "double tap" 并执行用户滑动控件时应该执行的操作?

所以...毕竟这是一个 Xamarin 问题。

要确保 VoiceOver 与自定义控件一起工作,您必须遵守 UIAccessibilityAction informal protocol. In my case it was accessibilityActivate()

但是因为我使用的是 Xamarin,所以我需要导出 方法,以确保运行时可以看到我从非正式协议实现了一个方法。

[Export("accessibilityActivate")]
public bool AccessiblityActivate() {
  Console.WriteLine("It works!");
  return true;
}