UICollectionView insertItemsAtIndexPaths:似乎重新加载集合视图或自动滚动到顶部
UICollectionView insertItemsAtIndexPaths: seems to reload collectionview or autoscrolls to top
我正在结合使用 UICollectionView
和 NSFetchedResultsController
。当我获取新数据时,我将它们放入 SQLite 数据库中,然后我的 frc 收到一个通知,它会更新。我实现了适当的委托方法并在批量更新中插入新数据,之后我不调用 reloadData
。但是一旦插入数据,集合视图就会滚动到顶部(以使新项目可见?)。我想干预这个过程并模仿 Facebook/9Gag 实现。当有新数据时,一个按钮会淡入,让用户滚动到顶部。在显示按钮时,新项目已经插入,因此用户也可以自己向上滚动。我尝试了以下方法:
- 连接到
UIScrollViewDelegate
方法以查看是否可以阻止 collectionView 滚动(在此更新过程中调用了 none 方法)
- 在 frc
willUpdate
时显示 "scroll to show more" 按钮,并在按下按钮时插入项目。问题是用户不能自己向上滚动
- 在插入项目之前,我计算了插入后当前可见项目的 indexPath(添加插入项目的数量),并在批量更新的完成块中滚动到没有动画的索引。这仅在我延迟滚动时有效,但随后它会闪烁,因为它首先向上滚动了一点
我尝试了同样的问题,方法是调用 "insertItemAtIndexPaths" 将数据递增到我的 collectionView 中。
我注意到两件事:
- 如果您在当前可见索引路径之后添加项目,则不会自动滚动
- 如果您在当前可见索引路径之前添加项目,则不会像您所说的那样自动滚动,但 contentOffset 保持在同一位置,但具有不同的 contentSize,因为您刚刚添加了新项目。
为了处理这个 "side effect",我使用了这里提到的解决方案:UICollectionView insert cells above maintaining position (like Messages.app)
正如下面post所解释的,"CATransaction.setDisableAction(false)"是平滑更新contentOffset位置的关键。
我正在结合使用 UICollectionView
和 NSFetchedResultsController
。当我获取新数据时,我将它们放入 SQLite 数据库中,然后我的 frc 收到一个通知,它会更新。我实现了适当的委托方法并在批量更新中插入新数据,之后我不调用 reloadData
。但是一旦插入数据,集合视图就会滚动到顶部(以使新项目可见?)。我想干预这个过程并模仿 Facebook/9Gag 实现。当有新数据时,一个按钮会淡入,让用户滚动到顶部。在显示按钮时,新项目已经插入,因此用户也可以自己向上滚动。我尝试了以下方法:
- 连接到
UIScrollViewDelegate
方法以查看是否可以阻止 collectionView 滚动(在此更新过程中调用了 none 方法) - 在 frc
willUpdate
时显示 "scroll to show more" 按钮,并在按下按钮时插入项目。问题是用户不能自己向上滚动 - 在插入项目之前,我计算了插入后当前可见项目的 indexPath(添加插入项目的数量),并在批量更新的完成块中滚动到没有动画的索引。这仅在我延迟滚动时有效,但随后它会闪烁,因为它首先向上滚动了一点
我尝试了同样的问题,方法是调用 "insertItemAtIndexPaths" 将数据递增到我的 collectionView 中。
我注意到两件事: - 如果您在当前可见索引路径之后添加项目,则不会自动滚动 - 如果您在当前可见索引路径之前添加项目,则不会像您所说的那样自动滚动,但 contentOffset 保持在同一位置,但具有不同的 contentSize,因为您刚刚添加了新项目。
为了处理这个 "side effect",我使用了这里提到的解决方案:UICollectionView insert cells above maintaining position (like Messages.app)
正如下面post所解释的,"CATransaction.setDisableAction(false)"是平滑更新contentOffset位置的关键。