问题
我想让 UICollectionView 对特定项目进行动画滚动。
这在大多数情况下都有效,但有时我试图滚动到的项目最终不会显示。
代码
- (void)onClick {
// (Possibly recompute the _items array.)
NSInteger target_idx = // (...some valid index of _items)
NSIndexPath *item_idx = [NSIndexPath indexPathForItem:target_idx inSection:0];
[self scrollToItem:item_idx];
}
- (void)scrollToItem:(NSIndexPath*)item_idx {
// Make sure our view is up-to-date with the data we want to show.
NSInteger num_items = [self.collection_view numberOfItemsInSection:0];
if (num_items != _items.count) {
[self.collection_view reloadData];
}
[self.collection_view
scrollToItemAtIndexPath:item_idx
atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally
animated:YES];
}
细节
self.collection_view
是一个 UICollectionView,由单行项目组成,具有标准流布局和启用水平滚动。- 我需要在滚动之前调用,因为自从 UICollectionView 上次显示它以来
reloadData
,它可能已经发生了变化。_items
- 这个问题只发生在动画滚动上;如果我通过
animated:NO
了,那么一切都会按预期进行。 - 当问题发生时,后滚动调用
indexPathsForVisibleItems
显示 UICollectionView不认为目标项是可见的。
任何想法为什么有时会默默地滚动到一个项目失败?
更新:问题似乎来自快速连续重新加载和滚动;如果没有重新加载,滚动将按预期进行。加载新数据后是否有任何用于滚动到项目的习语?