如何使iOS VoiceOver读取View和子视图作为一个整体

时间:2015-11-17 16:24:06

标签: ios uiview accessibility voiceover uiaccessibility

我有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,等等)。

我能实现吗?或者用户是否绝对需要刷卡?

2 个答案:

答案 0 :(得分:3)

我认为你所追求的是:

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

    这会将整个UITableViewCell作为单个元素呈现给VoiceOver(步骤1)(这很好,因为使用VoiceOver导航这些单元格的列表更加高效且用户友好),并允许您可以准确定制VoiceOver对单元格所说的内容(步骤2)。

    请注意,在第2步中,您可以更有创意 - 不仅仅是用逗号分隔所需顺序的所有标签,还要添加一些单词以使其更加用户友好(尽管我建议这里有点保守,不会陷入过于“讨厌”的情况,特别是如果用户在搜索某些东西时连续快速浏览了几个这样的单元格 - 过于繁琐的标签就会变得无聊。例如。如果它是一个购物应用程序,而不是“面包,1美元,有库存”(即只连接3个标签并用逗号分隔),你可以说“面包为1美元,有库存”(在Swift String(format:) Objective-C中的[NSString stringWithFormat:]是你的朋友;不要忘记本地化格式字符串。)

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

答案 1 :(得分:-2)

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

-(BOOL) isAccessibilityElement {
    return YES;
}