【发布时间】:2013-07-19 02:05:31
【问题描述】:
问题
我想让 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,由单行项目组成,具有标准流布局和启用水平滚动。 - 我需要在滚动之前调用
reloadData,因为自 UICollectionView 上次显示之后_items可能已经发生了变化。 - 这个问题只发生在动画滚动上;如果我通过
animated:NO,那么一切都会按预期进行。 - 当问题发生时,对
indexPathsForVisibleItems的后滚动调用显示 UICollectionView 不认为目标项可见。
任何想法为什么有时会默默地滚动到某个项目失败?
更新:问题似乎来自快速连续的重新加载和滚动;如果没有重新加载,滚动将按预期进行。加载新数据后滚动到某个项目是否有任何成语?
【问题讨论】:
-
我的猜测是 reloadData 调用给你搞砸了。如果你把它注释掉会发生什么?
-
@NicholasHart:这是个好主意,但问题是我的数据经常更改(这意味着我需要
reloadData),因此我想滚动到一个新项目(因为我有新数据)。如果我不重新加载,我可能会滚动到无效索引,可能会导致崩溃。重新加载后滚动似乎是一种应该相当普遍的模式,但也许不是? -
我并不是建议您不要重新加载作为一个行动方案,我只是询问暂时删除它是否会导致不良行为停止。如果是这样,您知道该采取哪个方向来寻找解决方案(例如:找出一种方法来等到表格完成重新加载后再滚动。)
-
如果我注释掉
reloadData,滚动似乎可以正常工作。所以问题就变成了:我们如何将重新加载与滚动结合起来?我尝试重新加载,异步等待,然后滚动,但问题仍然存在。也许我错过了一些invalidate电话? -
好吧,我不认为 UICollectionViewDelegate 或 UICollectionViewDataSource 有任何方法可以明确告诉您“重新加载完成”,所以这可能是一个难以解决的问题。我有点想知道在处理“点击”时重新加载。您的数据更新情况如何?也许您应该在数据更新时重新加载视图,而不是在处理用户输入时重新加载。
标签: ios objective-c scroll uicollectionview animated