重置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)
干杯!