如何让 VoiceOver 在 iOS 中宣布部分标签?

Posted

技术标签:

【中文标题】如何让 VoiceOver 在 iOS 中宣布部分标签?【英文标题】:How to get VoiceOver to announce section labels in iOS? 【发布时间】:2016-07-20 21:51:07 【问题描述】:

在 iPhone Weather App 中,使用 VoiceOver 时,我注意到第一次点击某个部分,它会宣布该部分。

例如,在 ios 9 中,第一次点击中间条中的任何项目将宣布“每小时预测”,然后继续描述您点击的元素。点击条带中的其他任何内容都不会宣布“每小时预报”。

点击底部表格中的任何内容,将在继续描述您点击的元素之前宣布“每日预测”。点击此表中的任何其他内容都不会以“每日预报”为前缀。

是否有一个简单的 API 来命名应用程序的各个部分?或者您是否必须通过跟踪画外音光标并动态更改标签来手动执行此操作? (这甚至有效吗?您可以在点击某物之后但在读取之前更改accessibilityLabel吗?)

【问题讨论】:

您可以使用 UIGestureRecognizer 来检测您想要的任何 UIView 上的触摸,使用布尔值来指示您已宣布某事的天气,并使用 AVSpeechUtterance 来宣布您想要什么。 @thealinisreal 我带着完全相同的问题来到这里。你有过这样的运气吗? @djibouti33 运气不好。很多关于通用可访问性实现的答案,但没有一个能解决这个特定场景。 【参考方案1】:

我猜有两种方法:

    继承 UITableViewCell 并覆盖accessibilityLabel。

    - (NSString *) accessibilityLabel
    
        NSString* voiceOverString;
        // append section title on voiceOverString and then the elements value
        return voiceOverString;
    
    

    请参阅Apple docs 的此链接: 您可以从 cellForRowAtIndexPath 设置单元格的AccessibilityLabel。该示例适用于天气应用程序本身。

【讨论】:

【参考方案2】:

是否有一个简单的 API 来命名应用程序的各个部分?

似乎最合适的参考是Apple's Accessibility Programming Guide。

及其 API,Apple's UIAccessibility Documentation。

设置shouldGroupAccessibilityChildren 属性似乎是实现目标的最佳方式。链接的 API 将其描述为,

一个布尔值,指示 VoiceOver 是否应将作为接收器的子元素的元素组合在一起,无论它们在屏幕上的位置如何。在垂直列中项目的父视图上将此属性的值设置为 YES 会导致 VoiceOver 尊重应用的分组并正确导航它们。

注意事项:

    目标元素是无障碍元素吗?(您可以使用isAccessibilityElement 属性检查;标准的UIKit 控件和视图默认实现UIAccessibility 协议) 如果是这样,您只需要设置其辅助功能属性 如果不是,则需要更改其值,view.isAccessibilityElement = true accessibilityLabel 属性标识元素 accessibilityHint 属性描述由元素触发的操作 您可以在情节提要中设置辅助功能属性 或者,您可以在视图子类的实现中设置可访问性属性

【讨论】:

shouldGroupAccessibilityChildren 属性仅影响 VoiceOver 光标导航元素的顺序,但此布尔值不提供命名该部分的方法。您描述了标记元素的方式,但我正在寻找一种在第一次获得焦点时在该部分中宣布元素本身之前点击任何元素时宣布部分名称的方法,就像天气应用程序一样。 您是否将包含视图的isAccessibilityElement 属性设置为true?如果你这样做并将其与子元素分组,那可能会解决它。 Apple 的天气应用程序可能像您提到的那样运行,因为它在容器视图中包含自定义元素。 “另一方面,容器视图包含用户可以与之交互的其他元素。例如,在执行自己的几何形状绘制的 UIView 的自定义子类中,形状表示用户可以与之交互的元素,以及哪些是与容器视图不同。容器视图中的这些单独元素不能自动访问(因为它们不是 UIView 的子类)。此方法可能会自动宣布该部分。 您还必须确保子元素不是模态的。如果视图是模态的,VoiceOver “忽略视图中与接收者同级的元素”。例如,“在包含同级视图 A 和 B 的窗口中,将视图 B 上的 accessibilityViewIsModal 设置为 true 会导致 VoiceOver 忽略视图 A 中的元素。另一方面,如果视图 B 包含子视图 C 并且您设置了 accessibilityViewIsModal在视图 C 上设置为 true,VoiceOver 不会忽略视图 A 中的元素。” API

以上是关于如何让 VoiceOver 在 iOS 中宣布部分标签?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 iOS VoiceOver 整体读取 View 和 subview

UIPageControl 和 VoiceOver/辅助功能

如何将自定义视图添加到 iOS VoiceOver 转子?

iOS Voice Over 在 UINavigationController 上推送/弹出时宣布新的视图标题

Xamarin 表单 - 如何在 TabbedView (iOS) 上自定义 VoiceOver

iOS 辅助功能 - 如何本地化 VoiceOver 语言