重置UICollectionView上的滚动

我有一个水平的UICollectionView工作正常,滚动。 当我点击一个项目,我更新我的数据,并调用reloadData 。 这工作和新的数据显示在UICollectionView 。 问题是滚动位置不变,它仍然是查看最后的地方。 我想重置滚动到顶部(或留在我的情况)。 我怎样才能做到这一点?

您可以使用此方法滚动到您想要的任何项目:

 - (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated 

你想要setContentOffset: 它使用CGPoint作为参数,你可以使用CGPointMake来设置你想要的,但是如果你想返回到集合的最开始,你可以简单地使用CGPointZero。

 [collectionView setContentOffset:CGPointZero animated:YES]; 

我经常在我的应用程序的不同部分使用这个,所以我只是扩展了UIScrollView,所以它可以在任何滚动视图和滚动视图子类上使用:

 extension UIScrollView { /// Sets content offset to the top. func resetScrollPositionToTop() { self.contentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top) } } 

所以无论何时我需要重置位置:

 self.collectionView.resetScrollPositionToTop() 

在Swift中:

 collectionView.setContentOffset(CGPointZero, animated: true) 

如果您离开包含收集视图的视图,请在第二个视图控制器中进行更改,并在返回时需要更新收集视图:

 @IBAction func unwindTo_CollectionViewVC(segue: UIStoryboardSegue) { //Automatic table reload upon unwind viewDidLoad() collectionView.reloadData() collectionView.setContentOffset(CGPointZero, animated: true) } 

在我的情况下展开是很好的,因为viewDidLoad调用将更新CoreData上下文,reloadData调用将确保collectionView更新反映新的CoreData上下文,然后contentOffset将确保表回到顶部。

对不起,在写这篇文章的时候我不能评论,但是我使用的是UINavigationController,而CGPointZero本身并没有让我到最顶层,所以我不得不使用下面的代码。

 CGFloat compensateHeight = -(self.navigationController.navigationBar.bounds.size.height+[UIApplication sharedApplication].statusBarFrame.size.height); [self.collectionView setContentOffset:CGPointMake(0, compensateHeight) animated:YES]; 

希望这有助于未来的人。 干杯!

在我的情况CGPointZero转移了收集视图的内容,因为你没有计算内容插入。 这是对我的工作:

  CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top); [self.collectionView setContentOffset:topOffest animated:YES]; 

要处理一个UINavigationController和一个透明的导航栏,我不得不计算额外的顶部偏移量,以完美匹配第一个元素的位置。

Swift 1.1代码:

  let topOffest = CGPointMake(0, -(self.collectionView?.contentInset.top ?? O)) self.collectionView?.setContentOffset(topOffest, animated: true) 

干杯!