在自定义视图上处理来自 VoiceOver 的“点击”

Posted

技术标签:

【中文标题】在自定义视图上处理来自 VoiceOver 的“点击”【英文标题】:Handle a "tap" from VoiceOver on a custom view 【发布时间】:2017-08-08 08:33:02 【问题描述】:

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

这个自定义视图基本上模仿了“滑动解锁”手势。这当然不适用于 VoiceOver,因为启用后,用户无法“滑动”,只能双击激活视图/按钮。

视图是UIView的子类,由子类UIVIews和一个从左到右捕捉手势的UIPanGestureRecognizer组成。

我首先向父类添加可访问性信息:

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

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

我尝试继承 UIControl 而不是 UIView 并覆盖 sendAction(),但没有调用此方法。

我不想将 UIAccessibilityTraitAllowsDirectInteraction 特征设置为控件,因为这不利于使应用程序可访问。

我该怎么做才能捕捉到“双击”并执行用户滑动控件时应该执行的操作?

【问题讨论】:

【参考方案1】:

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

为确保 VoiceOver 与自定义控件一起使用,您必须遵守 UIAccessibilityAction 非正式协议。就我而言,它是accessibilityActivate()。

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

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

【讨论】:

以上是关于在自定义视图上处理来自 VoiceOver 的“点击”的主要内容,如果未能解决你的问题,请参考以下文章

在自定义视图中处理 UITapGestureRecognizer

Grails 在自定义视图中关联来自两个不同域的值

在自定义视图单元中创建可绑定事件处理程序

将子视图添加到自定义 viewForHeaderInSection 会中断 VoiceOver 导航

在自定义表格视图 ios 中显示按钮

VoiceOver 在 iPhone 应用程序中读取上一个视图上的标签?漏洞?