在 UIMenuItem 上设置 accessibilityLabel

Set accessibilityLabel on UIMenuItem

我正在尝试设置 UIMenuItemaccessibilityLabel,但似乎没有效果。不管怎样,VoiceOver 只会读出项目的标题:

    let foo = UIMenuItem(title: "foo", action: #selector(doSomething))
    item.isAccessibilityElement = true
    item.accessibilityLabel = "bar"

对于此项,VoiceOver 读取 "foo" 而不是 "bar." 此外,accessibilityHint 似乎也被忽略了。

UIMenuItem元素实际上是一个UICalloutBarButton私有class包含一个UIButtonLabel(iOS13) 并且,您无法自定义其 a11y 属性,即使您可以轻松地对其进行编码(非正式协议)
这太疯狂了,因为为了销售 a11y 应用程序,您必须使其适应用户,而这里绝对不是这种情况。

但是,为了达到您的目标,可以实施如下解决方法:

  • 使菜单控制器不可访问 (a11yTraits = .none).
  • 获取菜单控制器框架(menuFrame 属性)进行下一步。
  • 创建一个可访问的元素,在显示时包裹菜单 (UIAccessibilityElement init + accessibilityFrameInContainerSpace).
  • 对于这个新的可访问元素,创建 a11y custom actions 匹配 [menuItems] ⟹ 的每个元素,您可以在此处提供 VoiceOver 标签。

最好为每个菜单项创建一个可访问的元素(然后提供更好的自定义)但是我没有找到获取框架的方法每个单独的项目。

而且,不幸的是,这个问题在过去 3 年里仍然存在。

⚠️⬛️◼️▪️编辑▪️◼️⬛️⚠️(2020/03/19)

我写了一个D开发者T技术S支持I ncident (no 731229763) 这个问题,这里是 Apple 的答案:

Our engineers have reviewed your request and have determined that you are experiencing a known issue for which there is no known workaround at this time.

我提交了一个错误报告,标题为 VoiceOver:accessibilityLabel 无法在 UIMenuItem 元素 上实现,引用 FB7623526

现在,您知道为什么 accessibilityLabel 对 UIMenuItem 元素无用且没有影响