代码之家  ›  专栏  ›  技术社区  ›  darbid

如何使用scrollToItemAtIndexPath在UICollectionView中以内容偏移量居中单元格

  •  0
  • darbid  · 技术社区  · 9 年前

    我正在实现一个UICollectionView,它只显示一行单元格。这就像一个图像封面流。这意味着我已经子类化了UICollectionViewFlowLayout。当我用手指滚动时,我的实现工作得很好,这意味着调用了下面的委托方法,并将单元格居中;

    -(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
    

    但是,当视图加载时,我希望视图自动滚动到单元格。对于此自动滚动,我使用以下选项:;

    [self.CollectionView scrollToItemAtIndexPath:_selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
    

    问题是未调用targetContentOffsetForProposedContentOffset,因此当自动滚动完成时,单元格偏离中心。

    那么,我如何以编程方式滚动我的集合视图,使其也以被滚动到的单元格为中心?

    1 回复  |  直到 9 年前
        1
  •  5
  •   darbid    9 年前

    我自己解决了这个问题。

    根据这本书 “iOS UI集合查看完整指南” (清单6.7)scrollToItemAtIndexPath:不能用于此封面流类型布局,因为它不会使单元格居中。

    我在下面贴出了书中建议的方式。根据您想要的indexPath,您需要自己计算集合视图的偏移量,然后使用targetContentOffsetForProposedContentOffset:自动将其居中。

    CGPoint proposedOffset = CGPointMake(0, 0);
    
    proposedOffset.x = _selectedIndexPath.item * (flow.itemSize.width + flow.minimumLineSpacing);
    
    CGPoint contentOffset = [flow targetContentOffsetForProposedContentOffset:proposedOffset withScrollingVelocity:CGPointMake(0, 0)];
    
    [self.statCollectionView setContentOffset:contentOffset animated:YES];