所以我有一个UICollectionView,其中包含一组使用自定义UILayout显示的UICollectionViewCell。
我已经将UILayout配置为布局所有UICollectionViewCells几乎与它们在ios上的照片应用程序中的布局方式完全相同。
问题是,当打开语音时,用户正在使用滑动遍历UICollectionViewCells,当用户到达页面上的最后一个可见单元格,并尝试向前滑动到下一个单元格时,它只是停下来。
我知道在UITableView中,单元格将继续向前移动,表格视图将自动向下滚动。
有谁知道如何获得这种行为?
答案 0 :(得分:20)
这个答案对我也有用。谢谢!
还必须启用另一个调用才能使其正常工作。否则,您的方法(void)accessibilityElementDidBecomeFocused永远不会被调用。您必须在对象Cell上启用辅助功能。
选项1:在ViewController中,将单元格实例设置为具有辅助功能。
Cell *cell = [cv dequeueReusableCellWithReuseIdentifier:kCellID forIndexPath:indexPath];
[cell setIsAccessibilityElement:YES];
选项2:在单元格对象中实现辅助功能界面:
- (BOOL)isAccessibilityElement
{
return YES;
}
- (NSString *)accessibilityLabel {
return self.label.text;
}
- (UIAccessibilityTraits)accessibilityTraits {
return UIAccessibilityTraitStaticText; // Or some other trait that fits better
}
- (void)accessibilityElementDidBecomeFocused
{
UICollectionView *collectionView = (UICollectionView *)self.superview;
[collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO];
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self);
}
答案 1 :(得分:12)
经过几个小时的头痛,解决方案非常简单。如果其他人遇到类似的问题,这就是我所做的:
在您用于CollectionView的UICollectionViewCell的子类中,覆盖accessibilityElementDidBecomeFocused并实现如下:
- (void)accessibilityElementDidBecomeFocused
{
UICollectionView *collectionView = (UICollectionView *)self.superview;
[collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO];
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, nil);
}
答案 2 :(得分:2)
我想补充一点,这似乎只影响iOS6;看起来他们在iOS7中修复了它。
此外,您可以通过将self而不是nil传递给UIAccessibilityPostNotification来使滚动更快更干净 - 就像这样:
- (void)accessibilityElementDidBecomeFocused {
UICollectionView *collectionView = (UICollectionView *)self.superview;
[collectionView scrollToItemAtIndexPath:[collectionView indexPathForCell:self] atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally|UICollectionViewScrollPositionCenteredVertically animated:NO];
UIAccessibilityPostNotification(UIAccessibilityLayoutChangedNotification, self);
}
答案 3 :(得分:0)
这是您在Swift中的操作方式:
override func accessibilityElementDidBecomeFocused() {
guard let collectionView = superview as? UICollectionView,
let indexPath = collectionView.indexPath(for: self) else {
return
}
collectionView.scrollToItem(at: indexPath, at: .left, animated: true)
UIAccessibility.post(notification: .layoutChanged, argument: nil)
}