如何使用 scrollToItemAtIndexPath 在 UICollectionView 中以内容偏移量居中单元格
How to center a cell with the content offset in a UICollectionView with scrollToItemAtIndexPath
我正在实现一个只显示一行单元格的 UICollectionView。这就像图像封面流。这意味着我已经子类化了 UICollectionViewFlowLayout。当我用手指滚动时,我的实现工作正常,这意味着将调用以下委托方法并将单元格居中;
-(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
但是,当视图加载时,我希望视图自动滚动到一个单元格。对于这个自动滚动,我使用以下内容;
[self.CollectionView scrollToItemAtIndexPath:_selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
问题是未调用 targetContentOffsetForProposedContentOffset,因此当自动滚动完成时,单元格偏离中心。
那么我如何以编程方式滚动我的集合视图,以便它也以滚动到的单元格为中心?
我自己解决了这个问题。
根据书本"iOS UICollectionView The Complete Guide"(清单 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];
我正在实现一个只显示一行单元格的 UICollectionView。这就像图像封面流。这意味着我已经子类化了 UICollectionViewFlowLayout。当我用手指滚动时,我的实现工作正常,这意味着将调用以下委托方法并将单元格居中;
-(CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity
但是,当视图加载时,我希望视图自动滚动到一个单元格。对于这个自动滚动,我使用以下内容;
[self.CollectionView scrollToItemAtIndexPath:_selectedIndexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:YES];
问题是未调用 targetContentOffsetForProposedContentOffset,因此当自动滚动完成时,单元格偏离中心。
那么我如何以编程方式滚动我的集合视图,以便它也以滚动到的单元格为中心?
我自己解决了这个问题。
根据书本"iOS UICollectionView The Complete Guide"(清单 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];