UIColViewView在UITableViewCell中具有辅助功能

时间:2016-08-08 01:55:33

标签: ios swift uitableview uicollectionview accessibility

我正在为我的iOS应用添加辅助功能支持,而且我在其中一个表格视图单元格中遇到了集合视图。

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

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

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

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

  1. 当用户点击第一个单元格时,它将被选中。
    1. 当用户点击“下一步”时,转到第二个单元格,然后点按该单元格,新单元格将被选中。
    2. 接下来的两个屏幕截图显示了表格视图单元格中的集合视图。

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

      但是,当用户点击“下一个”,进入下一个单元格,然后点击第二个单元格时,它不会被选中,而VoiceOver仍然会读取“我标记为0”。

      代码可用here on github

2 个答案:

答案 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方法中

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