UICollectionView insertItemsAtIndexPaths:似乎将collectionview或autoscrolls重新加载到顶部

时间:2015-02-19 10:15:29

标签: ios swift uiscrollview uicollectionview nsfetchedresultscontroller

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

  • 挂钩UIScrollViewDelegate方法,看看是否可以阻止collectionView滚动(在此更新过程中没有调用任何方法)
  • 显示"滚动以在frc willUpdate时显示更多" - 按钮,并在按下按钮时插入项目。问题是用户无法向上滚动
  • 在插入项目之前,我计算插入后当前可见项目的indexPath(添加插入项目的数量)并在批量更新的完成块中滚动到没有动画的索引。这只有在我延迟滚动时才有效,但随后它会闪烁,因为它首先向上滚动

1 个答案:

答案 0 :(得分:4)

我通过调用“insertItemAtIndexPaths”将数据增加到我的collectionView来实验同样的问题。

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

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

正如以下帖子中所解释的那样,“CATransaction.setDisableAction(false)”是平滑更新contentOffset位置的关键。