UICollectionView 中的辅助功能顺序不正确

Posted

技术标签:

【中文标题】UICollectionView 中的辅助功能顺序不正确【英文标题】:incorrect order of Accessibility in UICollectionView 【发布时间】:2015-11-10 22:01:04 【问题描述】:

所以我在 UIViewController 中有一个 UICollectionView,它是标签栏中的根视图控制器之一。我为 UICollectionView 设置了一个 contentInset,这样我就可以在 collectionView 的顶部添加一个标签,此时这意味着 UILabel 是 collectionView 的一部分,但不是 collectionView 的 headerView 的一部分。为了实现在 UICollectionView 中添加 UILabel,我使用了

collectionView.addSubview(theLabel)

然后我打开语音并运行应用程序。发生的情况是画外音以正确的顺序通过所有 UICollectionViewCells 一直到最后一个 CollectionViewCell 开始,然后转到位于 collectionView 顶部的标签,然后转到 tabBar。我在这个Change order of read items with VoiceOver 中尝试了答案,但没有运气,这个解决方案确实改变了

self.accessibilityElements

按照我想要的方式,除了画外音并没有真正遵循 self.accsibilityElements 中的顺序,而且我不确定发生了什么,有没有人遇到同样的麻烦,因为可访问性顺序被搞砸了,因为UICollectionView 上使用了“addsubView”。 IF(我说 IF,因为我认为没有人会以这种方式将 subView 添加到 collectionView 中)任何人有任何想法请在这里帮助我,被这个错误困扰的时间最长。

编辑

class CollectionViewSubViewsAddedByTags: UICollectionView 

override func awakeFromNib() 
    super.awakeFromNib()


var accessibilityElementsArray = [AnyObject]()

override var accessibilityElements: [AnyObject]?

    get
        return accessibilityElementsArray
    

    set(newValue) 
        super.accessibilityElements = newValue
    


override func accessibilityElementCount() -> Int 
    return accessibilityElementsArray.count


override func accessibilityElementAtIndex(index: Int) -> AnyObject? 
    return self.accessibilityElementsArray[index]


override func indexOfAccessibilityElement(element: AnyObject) -> Int 
    return (accessibilityElementsArray.indexOf( (element) -> Bool in
        return true
    ))!


override func didAddSubview(subview: UIView) 
    super.didAddSubview(subview)
    accessibilityElementsArray.append(subview)
    accessibilityElementsArray.sortInPlace  $0.tag<($1.tag)


override func willRemoveSubview(subview: UIView) 
    super.willRemoveSubview(subview)
    if let index = (accessibilityElementsArray.indexOf( (element) -> Bool in
        return true
    )) 
        accessibilityElementsArray.removeAtIndex(index)
    




谢谢, 沙布里

【问题讨论】:

为什么要在集合视图中添加子视图? 我们本可以使用这两种解决方案中的一种,我们已经在标题内有另一个视图(让我们将此视图称为广告视图) 1)在 collectionView 的标题内添加 theLabel 和广告视图 2)通过给 collectionView 一个 contentInset,将 theLabel 添加到 cpollectionView 的顶部。如果我们采用第一种方法,当我们处于横向时,问题就出现了,我们不想看到标签,假设我将 theLabel 和广告视图添加到带有一些常量的 headerView 中,当我在横向中隐藏 theLabel 时,我会约束有问题 同时当我们在collectionView的顶部隐藏导航栏时,我还想保留用户滚动了多少的标签,因为一旦用户在标签之后滚动, 我取消隐藏导航栏 显示您尝试更改可访问性顺序的代码 @Mr.T 我刚刚添加了代码,检查“didAddSubView” 【参考方案1】:

我遇到了同样的问题 - 我在我们的 UICollectionView 上使用了一个顶部插图,以便为通过滚动在屏幕上滑动的标题留出空间。如果我在此布局中使用 Voice Over,那么整个系统就会变得混乱,并且焦点顺序不正确。我为解决这个问题所做的是在激活 VO 时使用替代布局 - 我没有将标题放在带有插图的集合视图上,而是将标题垂直放置在集合视图上方并在集合视图上设置 0 顶部插图.

【讨论】:

以上是关于UICollectionView 中的辅助功能顺序不正确的主要内容,如果未能解决你的问题,请参考以下文章

iOS核心笔记——UICollectionView-辅助视图

UICollectionView 中的单元格顺序

当 UICollectionView 更改布局时覆盖 UIAccessibilityLayoutChangedNotification

如何修复uicollectionview中的单元格顺序

辅助功能 - 如何在元素上设置自定义选项卡焦点顺序

带有自定义 UI 按钮的 iOS 键盘的辅助功能选项卡顺序