使用VoiceOver可以访问大单元格的嵌套集合视图

时间:2017-07-31 14:13:53

标签: ios uicollectionview accessibility voiceover

在我目前正在处理的应用程序中,有一个嵌套的集合视图设置。外部集合视图包含可垂直滚动的大单元格,每个单元格包含另一个具有较小单元格的集合视图(子集合视图中的布局不同,这就是为什么有多个单元格)。

在视觉上,一切正常,但我遇到了Voice Over的问题:当我到达第一个子集合视图中的最后一个项目时(即外部集合视图的第一个单元格的最后一项),我无法通过滑动选择下一个项目。相反,iOS会将声音视为最后一个项目。

我可以用三指滑动向下滚动,然后选择下一个元素,但这显然不是必需的。选择最后一个元素并按相反顺序返回可以按预期工作。

当最初只有一个(外部集合视图的)单元格可见时,似乎只会出现问题。如果可以看到多个单元格,一切正常。但是,我无法更改外部单元格的大小,因为这会完全改变布局。

我在下面创建了一个示例视图控制器来演示此问题。除了单元格的大小之外,项目中的两个集合视图是相同的。具有较小单元格的第一个集合视图按预期工作。第二个没有(当选择下一个单元格时,iOS播放"蜂鸣声"当选择了最后一个可见单元格时发出声音,即使有更多单元格进一步向下)。

所以,我的问题是:

  • 如何使第二个集合视图的行为与第一个相同?
  • 如何通过水平滑动访问第二个集合视图中的单元格?

到目前为止我尝试过的解决方案:

  • 一篇SO帖子建议为嵌套集合视图创建包装器视图。这似乎没什么区别。
  • 我试图在集合视图的自定义子类中自己实现UIAccessibilityContainer协议。这似乎以奇怪的方式打破滚动。
  • 放置"布局已更改"随机地点的通知,看它是否有帮助(它没有)

编辑: 演示此问题的ViewController的完整代码:

import io
Image.open(io.BytesIO(graph.create_png()))

修改:这是一段显示问题的视频:https://vimeo.com/229249955(请注意,我在那里添加了一些描述)。

1 个答案:

答案 0 :(得分:2)

根据我的理解问题,一旦到达内部集合视图中的最后一个单元格,就无法滚动到外部集合视图中的下一个单元格。但是,三指滑动有效。

这是因为集合视图上的反弹属性。尝试关闭内部集合视图上的bounce属性。

在上面的代码中,在OuterCell init方法中添加以下代码行。

innerCollectionView.bounces = false