具有可访问性的 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的主要内容,如果未能解决你的问题,请参考以下文章
如何从具有可链接性的 jQuery 插件的方法返回对象数组?
iOS 设计具有可定制内容的 UITableViewCell