我在iOS 13中遇到可访问性的特殊问题。
我有一个实现为UICollectionView的日历。如果VoiceOver处于打开状态,则集合视图为空-根本不会填充任何UICollectionViewCells。
我已覆盖正确的UICollectionViewDataSource调用。调用numberOfSections
和collectionView(numberOfItemsInSection)
,并返回正确的非零值。但是collectionView(cellForItemAt)
从未被调用。那对我来说毫无意义。它知道我有多少节,有多少件物品,但并不关心这些物品。
如果关闭VoiceOver,它将调用collectionView(cellForItemAt)
,并正确填充我的收藏夹视图。在iOS 12中,无论VoiceOver是否打开,一切都可以正常工作。
我缺少什么,或者如何调试? VoiceOver的状态如何影响我的收藏夹视图是否被填充?
我们向苹果代表报告了该问题,并得到了答复。发生的事情是,在iOS 13中,VoiceOver会向集合视图询问有关大于可见区域的信息。这是有意的更改,以支持某些类型的集合视图,这些视图的内容大小事先未知。因此,它调用了layoutAttributesForElements(in rect:)
的覆盖,并为rect设置了较大的Y负值,而我们那里没有任何元素。
我们的解决方法是忽略给出的矩形的Y值,而是使用0
的Y值。然后,iOS可以找到我们的收藏夹视图单元。