UICollectionView insertItemsAtIndexPaths:似乎重新加载collectionview或自动滚动到顶部

Posted

技术标签:

【中文标题】UICollectionView insertItemsAtIndexPaths:似乎重新加载collectionview或自动滚动到顶部【英文标题】:UICollectionView insertItemsAtIndexPaths: seems to reload collectionview or autoscrolls to top 【发布时间】:2015-02-19 10:15:29 【问题描述】:

我将UICollectionViewNSFetchedResultsController 结合使用。当我获取新数据时,我将它们放入 SQLite 数据库中,并且我的 frc 会收到一条通知,它将更新。我实现了适当的委托方法并在批量更新中插入新数据,之后我不调用reloadData。但是一旦插入数据,collectionview 就会滚动到顶部(以使新项目可见?)。我想干预这个过程并模仿 Facebook/9Gag 的实现。当有新数据时,一个按钮会淡出,让用户滚动到顶部。在显示按钮时,新项目已经插入,因此用户也可以自己向上滚动。我尝试了以下方法:

连接到UIScrollViewDelegate 方法以查看是否可以阻止collectionView 滚动(在此更新过程中不会调用任何方法) 在 frc willUpdate 时显示“滚动显示更多”按钮,并在按下按钮时插入项目。问题是用户不能自己向上滚动 在插入项目之前,我会在插入后计算当前可见项目的 indexPath(添加插入项目的数量),并在批量更新的完成块中滚动到该索引而不使用动画。这仅在我延迟滚动时才有效,但随后它会闪烁,因为它首先向上滚动一点

【问题讨论】:

你可以使用这个answer。它基于 UICollectionViewLayout。 【参考方案1】:

我尝试了同样的问题,通过调用“insertItemAtIndexPaths”将数据增加到我的 collectionView 中。

我注意到两件事: - 如果在当前可见索引路径之后添加项目,则不会自动滚动 - 如果您在当前可见索引路径之前添加项目,则不会像您说的那样自动滚动,但 contentOffset 保持在同一位置,但 contentSize 不同,因为您刚刚添加了新项目。

为了处理这种“副作用”,我使用了这里提到的解决方案:UICollectionView insert cells above maintaining position (like Messages.app)

如下文所述,“CATransaction.setDisableAction(false)”是平滑更新 contentOffset 位置的关键。

【讨论】:

以上是关于UICollectionView insertItemsAtIndexPaths:似乎重新加载collectionview或自动滚动到顶部的主要内容,如果未能解决你的问题,请参考以下文章

折叠UICollectionView

-[UICollectionView _endItemAnimations] 中的 UICollectionView 断言失败

如何滚动另一个 UICollectionView 下方的 UICollectionView?

UICollectionView 单元内部已加载,但 UICollectionView 未显示

UICollectionView 断言失败 -[UICollectionView _updateWithItems:tentativelyForReordering:]

UITableviewCell 中的 UICollectionView。添加约束后,UICollectionView 不显示