如何让 iOS VoiceOver 将 View 和 subview 作为一个整体朗读

How to make iOS VoiceOver read View and subview as a whole

我有一个显示项目列表的 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,等等。读取这些子类时,读取顺序很好(UILabel 1a,然后是 1b,等等)。

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

我想你追求的是:

  1. 在 UITableViewCell
  2. 上设置 isAccessibilityElement = true
  3. UITableViewCell
  4. 上将 accessibilityLabel 设置为您想要的任何值

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

请注意,在第 2 步中,您还可以更有创意一些 - 不仅仅是按所需顺序说出所有标签并用逗号分隔,还可以添加一些词以使其更加人性化(尽管我会建议在这里保守一点,以免出现太过 "chatty" 的情况,尤其是当用户在搜索某些内容时快速连续地浏览几个这样的单元格时——太冗长的标签会让人厌烦)。例如。如果它是一个购物应用程序,而不是 "Bread, USD 1, in stock"(即仅连接 3 个标签并用逗号分隔),您可以说 "Bread for USD 1, in stock"(Swift 和 [=15 中的 String(format:) =] 在 Objective-C 中是你的朋友;不要忘记本地化格式字符串)。

当然,如果后面需要在单元格中有一些按钮,那就有点复杂了。但这是另一个问题:-)

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

-(BOOL) isAccessibilityElement {
    return YES;
}