你不能用scrollToItemAtIndexPath:atScrollPosition:animated
这个。
希望他们将来会添加一个新方法scrollToSupplementaryElementOfKind:atIndexPath:
,但目前唯一的方法是直接操作 contentOffset。
下面的代码显示了如何使用 FlowLayout 将标题垂直滚动到顶部。您可以对水平滚动执行相同的操作,或将此想法用于其他布局类型。
NSIndexPath *indexPath = ... // indexPath of your header, item must be 0
CGFloat offsetY = [collectionView layoutAttributesForSupplementaryElementOfKind:UICollectionElementKindSectionHeader atIndexPath:indexPath].frame.origin.y;
CGFloat contentInsetY = self.contentInset.top;
CGFloat sectionInsetY = ((UICollectionViewFlowLayout *)collectionView.collectionViewLayout).sectionInset.top;
[collectionView setContentOffset:CGPointMake(collectionView.contentOffset.x, offsetY - contentInsetY - sectionInsetY) animated:YES];
请注意,如果您有非零contentInset
(如在 iOS 7 中,当滚动视图在栏下方展开时),您需要从 中减去它offsetY
,如图所示。对sectionInset
.
更新:
该代码假定布局处于准备好的“有效”状态,因为它使用它来计算偏移量。当集合视图呈现其内容时,布局就准备好了。
[_collectionView.collectionViewLayout prepareLayout]
当您需要滚动尚未呈现的集合视图时(例如) ,调用上述代码之前的调用可能会有所帮助viewDidLoad
。调用layoutIfNeeded
(正如评论中建议的@Vrasidas)也应该起作用,因为它还准备了布局。