【问题标题】:incorrect order of Accessibility in UICollectionViewUICollectionView 中的辅助功能顺序不正确
【发布时间】: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”

标签: ios swift uicollectionview uiaccessibility


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2022-11-30
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-23
    • 2021-01-16
    相关资源
    最近更新 更多