我正在为我的iOS应用添加辅助功能支持,而且我在其中一个表格视图单元格中遇到了集合视图。
例如,当用户从第一个单元格(水平地)滚动到第二个单元格时,“辅助功能”仍然会读取第一个单元格的内容。如果我尝试点击第二个单元格中的一个视图,它会突出显示第二个单元格左侧的空白区域(第一个单元格将在哪里但不再可见)并读取第一个单元格的内容。
当表视图单元格(即UIView的子视图)中的集合视图不时,不会发生这种情况。
我怀疑这与调用UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification)
有关,我尝试在很多不同的地方调用它,但没有任何效果。
以下两个屏幕截图显示了UIView中的集合视图。已启用辅助功能,因此在轻触时会选择黑色边框。
接下来的两个屏幕截图显示了表格视图单元格中的集合视图。
当用户点击第一个单元格时,它会被选中并且VoiceOver会正确读取“我是标签0”。
但是,当用户点击“下一个”,进入下一个单元格,然后点击第二个单元格时,它不会被选中,而VoiceOver仍然会读取“我标记为0”。
代码可用here on github。
答案 0 :(得分:6)
我有simillar问题,我最终解决了。 我认为你的元素与
不匹配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。
要让好的3指语音滚动你可能想要覆盖
func accessibilityScroll(_ direction: UIAccessibilityScrollDirection) -> Bool
并相应地滚动您的集合视图。
答案 1 :(得分:0)
你可能想试试这个:
let nextCell = collectionView.cellForItemAtIndexPath(nextIndexPath)
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification,
argument: nextCell)
致电onNextButtonTapped
后,在scrollToItemAtIndexPath
方法中。
这会将辅助功能集中在下一个集合视图单元格上。