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 更改布局时覆盖 UIAccessibilityLayoutChangedNotification