具有可访问性的 UITableViewCell 中的 UICollectionView

Posted

技术标签:

【中文标题】具有可访问性的 UITableViewCell 中的 UICollectionView【英文标题】:UICollectionView in a UITableViewCell with Accessibility 【发布时间】:2016-08-08 01:55:32 【问题描述】:

我正在向我的 ios 应用程序添加辅助功能支持,但我的一个表格视图单元格中的集合视图出现问题。

例如,当用户从第一个单元格(水平)滚动到第二个单元格时,辅助功能仍会读取第一个单元格的内容。如果我尝试点击第二个单元格中的视图,它会突出显示第二个单元格左侧的空白区域(第一个单元格将在该位置但不再可见)并读取第一个单元格的内容。

当集合视图不在在表格视图单元格(即 UIView 的子视图)中时,不会发生这种情况。

我怀疑这与调用 UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification) 有关,我尝试在许多不同的地方调用它,但没有任何效果。

以下两个屏幕截图显示了 UIView 中的集合视图。辅助功能已启用,因此在点击时会以黑色边框被选中。

    当用户点击第一个单元格时,它将被选中。

    当用户点击“下一步”,转到第二个单元格并点击该单元格时,新单元格将被选中。

接下来的两个屏幕截图显示了表格视图单元格内的集合视图。

当用户点击第一个单元格时,它会被选中,并且 VoiceOver 会正确读取“我是标签 0”。

但是,当用户点击“下一步”,转到下一个单元格并点击第二个单元格时,它不会被选中,VoiceOver 仍会显示“我是标签 0”。

代码在here on github可用。

【问题讨论】:

【参考方案1】:

我有类似的问题,我最终解决了。 我认为您的元素与

不匹配
isAccessibilityElement = true 

彼此重叠。

我有一个垂直滚动的表格视图,每个单元格包含一个水平滚动的标题和集合视图。

我只在标题和集合视图单元格上将isAccessibilityElement 设置为true,在其余部分设置false

然后,我继承了UICollectionView 并覆盖了以下NSObject 方法:

func accessibilityElementCount() ->  Int
func accessibilityElement(at: Int) -> Any?
func index(ofAccessibilityElement element: Any) -> Int

它基本上只是告诉配音您的收藏视图具有这些可访问的元素。相反,集合视图本身不可访问,这不是问题。你可能会使用

open var accessibilityElements: [Any]?

改为。

这里是从文档 (UIAccessibility.h) 中阅读的更多内容:

UIAccessibilityContainer 方法可以被覆盖以出售由单个 UIView 管理的单个元素。

例如,单个 UIView 可能会绘制多个(对最终用户)具有不同含义和功能的项目。将每个项目作为单独的可访问性元素出售非常重要。

容器的子元素不是具体的UIView 实例(可能是绘制的文本或图标)可以使用 UIAccessibilityElement 类的实例来表示(参见 UIAccessibilityElement.h)。

辅助功能容器必须返回 NO 到 -isAccessibilityElement。

为了让三指语音滚动滚动,您可能需要覆盖

func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool

并相应地滚动您的收藏视图。

【讨论】:

如果您链接了报价来源,那就太好了。 (并且在开头插入 > 而不是四个空格会将其格式化为引号而不是代码块。)【参考方案2】:

你可能想试试这个:

let nextCell = collectionView.cellForItemAtIndexPath(nextIndexPath)
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
                                argument: nextCell)

在您的onNextButtonTapped 方法中,在您调用scrollToItemAtIndexPath 之后。

这会将辅助功能集中在下一个集合视图单元格上。

【讨论】:

我试过了,虽然它会在新单元格出现时读取它,但再次点击该单元格仍会导致前一个单元格被选中。 我相信在 iOS 10 之前,滚动视图不会自动更新accessibilityFrame 存在问题。我不确定细节,但你可能想调查一下。您的屏幕截图显示框架仍然集中在第一个单元格上。修改后的代码是这样吗? 当发布 UIAccessibilityScreenChangedNotification 时,它会正确选择第二个单元格(并且 VoiceOver 会读出“我是标签 1”),但是进一步的交互总是会再次选择第一个单元格。 你最终解决了这个问题吗? @marcelli407 不,我没有@ShaiMishali

以上是关于具有可访问性的 UITableViewCell 中的 UICollectionView的主要内容,如果未能解决你的问题,请参考以下文章

第2186期使用浏览器开发工具测试网站可访问性的七种方法

自定义 UITableViewCell 可访问性

如何从具有可链接性的 jQuery 插件的方法返回对象数组?

iOS 设计具有可定制内容的 UITableViewCell

寻找具有可重用性的免费 .NET ORM/BL 工具 [关闭]

如何在本机反应中禁用文本输入的字体缩放(可访问性的动态类型)?