当我在集合视图的开头插入新元素时,它会维护现有的contentOffset,这意味着我前置到集合视图的新元素与之前的元素出现在同一位置,但我想要它们插在屏幕左侧。
所以我手动维护contentOffset并相应地移动它。但是,如果我在新项目添加到集合时滚动,则会导致闪烁。我使用performWithoutAnimation
来避免元素在整个地方飞行,但这并不能完全解决问题。
有没有办法自然地将元素添加到集合视图中,而不会将整个内容区域向右移动?
据我了解会发生什么:
这是我使用的代码:
CGSize oldContentSize = self.collectionView.contentSize;
[UIView performWithoutAnimation:^{
[self.collectionView performBatchUpdates:^{
__block NSMutableArray *indexPaths = [NSMutableArray new];
[objects enumerateObjectsUsingBlock:^(id *post, NSUInteger index, BOOL *stop) {
NSIndexPath *indexPath = [NSIndexPath indexPathForItem:index inSection:0];
[self.fetchedObjects insertObject:post atIndex:0];
[indexPaths addObject:indexPath];
}];
[self.collectionView insertItemsAtIndexPaths:indexPaths];
} completion:^(BOOL finished) {
CGSize newContentSize = self.collectionView.contentSize;
CGPoint newContentOffset = self.collectionView.contentOffset;
newContentOffset.x = (newContentSize.width - oldContentSize.width) + newContentOffset.x;
[self.collectionView setContentOffset:newContentOffset];
}];
}];
我也尝试了reloadData
,但它是异步的,因此之后不会计算新的内容大小。