我正在研究一个日历的可访问性,它实际上是一个collectionView。每当点击一个单元格时,collectionView将通过调用
[self.collectionView reloadData];
问题是如果画外音正在运行,则在点击单元格后焦点将移动到另一个地方,因为该单元格在其他地方被重用。在reloadData之后,是否有办法保持焦点在原来的位置?谢谢!
kkih6yb81#
只要找到一个解决办法就可以了。焦点被更改是因为在执行[collecionView reloadData]时,焦点单元格在其他地方被重用。因此,如果我们逐个重新加载collectionViewCells,则聚焦的单元格将不会在其他位置使用。我调用此方法是为了在运行VoiceOver时重新加载collectionView。
- (void)reloadCalendarCollectionView { NSInteger items = [self.calendarItems count]; for (NSInteger i = 0; i < items; i++) { [self.collectionView reloadItemsAtIndexPaths:@[[NSIndexPath indexPathForItem:i inSection:1] ]]; } }
r55awzrz2#
你可以尝试在重载数据之前执行self.collectionView.accessibilityElementsHidden = YES,然后,当它完成时,你将不得不执行相反的操作&然后为你正在寻找的单元格发布一个通知。
self.collectionView.accessibilityElementsHidden = YES
u5rb5r593#
我们有一个集合视图,这个集合视图每秒重新加载数据。当用户点击单元格时,焦点在每次重新加载后都会改变,所以集合视图单元格在indexPath选择了错误的单元格。在单元格中创建委派协议:
protocol AccessibilityCellProtocol{ func accessibilityFocused(cell:UICollectionViewCell) }
覆盖可访问性ElementDid在单元格中成为焦点:
override class func accessibilityElementDidBecomeFocused(){ self.delegate.accessibilityFocused(cell:self) }
在视图控制器中创建一个selectedIndexPath变量,用委托方法赋值。
func accesibilityFocused(cell:UITableViewCell){ selectedIndex = collectionView.indexPath(for: cell) }
在didSelectItemAtIndexPath方法中:
if UIAccessibility.isVoiceOverRunning{ cellTappedWith(indexPath:selectedIndex) return } cellTappedWithIndexPath(indexPath:indexPath)
3条答案
按热度按时间kkih6yb81#
只要找到一个解决办法就可以了。焦点被更改是因为在执行[collecionView reloadData]时,焦点单元格在其他地方被重用。
因此,如果我们逐个重新加载collectionViewCells,则聚焦的单元格将不会在其他位置使用。我调用此方法是为了在运行VoiceOver时重新加载collectionView。
r55awzrz2#
你可以尝试在重载数据之前执行
self.collectionView.accessibilityElementsHidden = YES
,然后,当它完成时,你将不得不执行相反的操作&然后为你正在寻找的单元格发布一个通知。u5rb5r593#
我们有一个集合视图,这个集合视图每秒重新加载数据。当用户点击单元格时,焦点在每次重新加载后都会改变,所以集合视图单元格在indexPath选择了错误的单元格。
在单元格中创建委派协议:
覆盖可访问性ElementDid在单元格中成为焦点:
在视图控制器中创建一个selectedIndexPath变量,用委托方法赋值。
在didSelectItemAtIndexPath方法中: