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

Posted

技术标签:

【中文标题】如何让 iOS VoiceOver 整体读取 View 和 subview【英文标题】:How to make iOS VoiceOver read View and subview as a whole 【发布时间】:2015-11-17 16:24:05 【问题描述】:

我有一个UITableView,它显示一个项目列表,其子类为UITableViewCell。在那个单元格中,我有一个 UILabels 的层次结构和子视图,如下所示:

UITableViewCell subclass
- UILabel a
- UILabel b
- UILabel c
- UIView subclass 1
    - UILabel 1a
    - UILabel 1b
- UIView subclass 2
    - UILabel 2a
    - UILabel 2b

我希望 VoiceOver 按此处显示的顺序阅读所有标签。我应该在这里注意,在视觉上,UIView 子类中的标签是相反的顺序(例如,UILabel 1b 在UILabel 1a 之上)。

某些标签需要将“accessibilityLabel”属性设置为某个自定义字符串。它是在UITableViewCell 的配置中完成的,一旦知道文本,直接标记或子视图。我还将shouldGroupAccessibilityChildren 属性设置为YES。

现在,我的行为是:VoiceOver 读取*** UILabel(示例中为 a、b 和 c)。然后,如果我滑动以获取下一个元素,它将读取 UIView 子类 1,然后是 2,等等。在读取这些子类时,读取顺序很好(UILabel1a,然后是 1b,等等)。

我能做到这一点吗?还是用户绝对需要滑动?

【问题讨论】:

不是 100% 清楚您想要确切更改的内容,但您是否考虑过使用 accessibilityElements,或禁用包含标签的可访问性并在容器上设置标签? 现在,用户必须滑动 3 次才能听到一个单元格的所有信息(一个用于***标签,一个用于每个 UIView 子类)。我希望在第一次滑动时说出所有信息。在我的测试中,设置accessibilityElements 会使 VoiceOver 一次只说出一个信息(因此在我的示例中用户必须滑动 7 次)。我希望这可以使问题更加清晰! 【参考方案1】:

我想你所追求的是:

    在 UITableViewCell 上设置 isAccessibilityElement = trueUITableViewCell 上将accessibilityLabel 设置为您想要的任何内容

这会将整个 UITableViewCell 作为单个元素呈现给 VoiceOver(第 1 步。)(这很棒,因为使用 VoiceOver 在此类单元格列表上导航更加高效且用户友好),并允许您准确自定义 VoiceOver 对单元格的表述(步骤 2。)。

请注意,在第 2 步中,您还可以更有创意 - 不仅要按所需顺序以逗号分隔所有标签,还要添加一些单词以使其更加用户友好(尽管我建议在这里要保守一点,不要陷入演示过于“健谈”的情况,特别是如果用户在搜索某些内容时快速连续通过几个这样的单元格 - 过于健谈的标签会变得令人厌烦)。例如。如果它是一个购物应用程序,而不是“Bread, USD 1, in stock”(即只需连接 3 个标签并用逗号分隔),您可以说“Bread for USD 1, in stock”(String(format:) Swift 和 @ Objective-C 中的 987654326@ 是你的朋友;不要忘记本地化格式字符串。

当然,如果你以后需要在单元格中添加一些按钮,它会变得有点复杂。但这是另一个问题:-)

【讨论】:

我在不同的测试中错过了第 1 步。我已经根据您的建议自定义了需要自定义的字符串,但确实有很大的不同! 我发现最好覆盖可访问性标签属性,并收集子视图的标签。通过这种方式,它可以正确响应其子项的动态变化。 你有没有想出一个通用的方法来收集子视图的辅助功能标签?这是设计上的递归任务,并且不太容易以本地化方式组合在一起。我很高兴看到你如何做到这一点的样本。【参考方案2】:

还有一个地方,在你的子类中,覆盖方法:

-(BOOL) isAccessibilityElement 
    return YES;

【讨论】:

这与 self.isAccessibilityElement = YES 的效果相同。 回调比较好。 仅此一项,实际上会使子视图无法访问。必须继续将可访问性标签、提示、值或其他任何内容添加到单元格本身。 (在这种情况下,结合所有子视图的内容)

以上是关于如何让 iOS VoiceOver 整体读取 View 和 subview的主要内容,如果未能解决你的问题,请参考以下文章

如何让 VoiceOver 读出与 UITextView 不同的文本?

iOS Voiceover 从覆盖的 UIWindow 中读取

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

在 iOS 上模拟 VoiceOver 辅助功能点击

iOS VoiceOver – 在标准 UIView 中实现“x of y”读出?

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