将项目前置到集合视图而不会中断滚动

时间:2015-03-18 14:13:48

标签: objective-c collectionview

当我在集合视图的开头插入新元素时,它会维护现有的contentOffset,这意味着我前置到集合视图的新元素与之前的元素出现在同一位置,但我想要它们插在屏幕左侧。

所以我手动维护contentOffset并相应地移动它。但是,如果我在新项目添加到集合时滚动,则会导致闪烁。我使用performWithoutAnimation来避免元素在整个地方飞行,但这并不能完全解决问题。

有没有办法自然地将元素添加到集合视图中,而不会将整个内容区域向右移动?

据我了解会发生什么:

  1. 集合视图会插入新项目并准备显示它们。
  2. 我将contentOffset推进到新的位置。
  3. 在插入新项目重新加载之前,屏幕上显示了单元格,因为集合视图认为它们变得不可见。
  4. 这是我使用的代码:

        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,但它是异步的,因此之后不会计算新的内容大小。

0 个答案:

没有答案