【发布时间】:2015-02-08 09:34:07
【问题描述】:
我正在使用 VoiceOver,但遇到了 UICollectionView 的问题。我有一个带有十个按钮的初始屏幕,每个按钮都链接到集合视图中的十个单元格之一。集合视图实际上是屏幕的全尺寸,每个单元格都包含一个子视图控制器。这一切都可以在 VoiceOver 关闭的情况下正常工作,但是当它打开时,激活集合中间的一个按钮总是会导致集合视图弹出到它的第一个单元格,即使我没有点击第一个按钮。我认为这是因为 VoiceOver “焦点”转到了它看到的第一个元素(即第一个单元格)。
我已经尝试使用UIAccessibilityScreenChangedNotification 以及与相关单元格参数相同的 Layout,但它没有任何区别,它没有弹出到我需要的元素,并且总是弹出到第一个单元格中收藏。
我在这里做错了什么?
我正在添加一个 sn-p,它在 viewDidLayoutSubviews 中调用,如果 VoiceOver 关闭,它可以很好地用于实际滚动。但是一旦 VO 开启,它就会中断。
if (self.initialIndexPath) {
[self.collectionView scrollToItemAtIndexPath:self.initialIndexPath atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
UIAccessibilityPostNotification(UIAccessibilityScreenChangedNotification, [self.collectionView cellForItemAtIndexPath:self.initialIndexPath]);
}
这对于实际关注单元格来说非常有效,但旁白部分被完全忽略,通知根本不会将焦点转移到正确的单元格,它始终是第一个单元格中的第一个元素。
还要注意,单元格本身不是可访问性元素,也不应该是,它们实现了UIAccessibilityContainer 协议,因此每个单元格的标题标签将是我希望焦点结束的地方。
【问题讨论】:
-
您找到解决此问题的任何方法或解决方法了吗?我也面临同样的问题。
-
在您的 UIAccessibilityScreenChangedNotification 之后,可能会在集合单元格滚动完成后触发另一个通知,因此它仍然会转到第一个元素。您是否打算在您点击按钮 x 后,集合视图将滚动到单元格 x?单元格 x 占据了整个宽度还是多个单元格适合屏幕?
-
这是可能的,但我已经证实我没有这样做。我已经在模拟器中打开了可访问性检查器,此时发出了四五个通知,但我确保我已经关闭了所有的通知,并且它们仍然被发送,所以我认为系统是这样做。
-
单元格是全屏的。这个想法是您选择一个单元格,它会滚动到该单元格,然后您可以从那里向左/向右滑动以在单元格之间移动,就像您使用过 BBC 新闻应用程序中的故事一样。
-
我之前已经针对这个问题提交了一个 Radar (openradar.appspot.com/radar?id=5876737380450304) 并做了一个示例项目 (github.com/jszumski/collection-view-voice-over-focus)。
标签: ios objective-c uicollectionview accessibility voiceover