如何让 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
。在那个单元格中,我有一个 UILabel
s 的层次结构和子视图,如下所示:
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,等等。在读取这些子类时,读取顺序很好(UILabel
1a,然后是 1b,等等)。
我能做到这一点吗?还是用户绝对需要滑动?
【问题讨论】:
不是 100% 清楚您想要确切更改的内容,但您是否考虑过使用accessibilityElements
,或禁用包含标签的可访问性并在容器上设置标签?
现在,用户必须滑动 3 次才能听到一个单元格的所有信息(一个用于***标签,一个用于每个 UIView
子类)。我希望在第一次滑动时说出所有信息。在我的测试中,设置accessibilityElements
会使 VoiceOver 一次只说出一个信息(因此在我的示例中用户必须滑动 7 次)。我希望这可以使问题更加清晰!
【参考方案1】:
我想你所追求的是:
-
在 UITableViewCell 上设置
isAccessibilityElement = true
在UITableViewCell
上将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 中读取