我有一个水平的 UICollectionView
,它能够正常滚动。当我点击某个元素时,我会更新我的数据并调用 reloadData
。这样做是有效的,并且新的数据也能在 UICollectionView
中显示出来。
问题在于,滚动位置没有改变,仍然停留在最后一个位置。我想将滚动重置到顶部(或者在我的情况下是左侧)。我该如何做到这一点?
我有一个水平的 UICollectionView
,它能够正常滚动。当我点击某个元素时,我会更新我的数据并调用 reloadData
。这样做是有效的,并且新的数据也能在 UICollectionView
中显示出来。
问题在于,滚动位置没有改变,仍然停留在最后一个位置。我想将滚动重置到顶部(或者在我的情况下是左侧)。我该如何做到这一点?
您需要使用setContentOffset:
方法。它需要一个CGPoint作为参数,您可以使用CGPointMake设置任何您想要的值,但如果您希望返回到集合视图的最开始位置,您可以简单地使用CGPointZero。
[collectionView setContentOffset:CGPointZero animated:YES];
setContentOffset
帮助我在 UIScrollView 上也解决了这个问题。 - NeverHopelesscontentInsets
,你可以使用以下的点作为内容偏移量 CGPointMake(-collectionView.contentInset.left, -collectionView.contentInset.top)
。 - TPoschel你可以使用这种方法滚动到任何你想要的项目:
- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UICollectionViewScrollPosition)scrollPosition
animated:(BOOL)animated
我在我的应用的不同部分经常使用它,所以我扩展了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将确保表格回到顶部。
collectionView.setContentOffset(CGPointZero, animated: true)
无法正常工作,因此您可以使用通用扩展:
extension UIScrollView {
func scrollToTop(_ animated: Bool) {
var topContentOffset: CGPoint
if #available(iOS 11.0, *) {
topContentOffset = CGPoint(x: -safeAreaInsets.left, y: -safeAreaInsets.top)
} else {
topContentOffset = CGPoint(x: -contentInset.left, y: -contentInset.top)
}
setContentOffset(topContentOffset, animated: animated)
}
}
CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top);
[self.collectionView setContentOffset:topOffest animated:YES];
很抱歉,我在写这篇文章时无法进行评论,但是我正在使用一个UINavigationController,而CGPointZero
本身并没有让我到达最顶部,所以我不得不使用以下代码。
CGFloat compensateHeight = -(self.navigationController.navigationBar.bounds.size.height+[UIApplication sharedApplication].statusBarFrame.size.height);
[self.collectionView setContentOffset:CGPointMake(0, compensateHeight) animated:YES];
UINavigationController
和一个透明的导航栏,我需要计算额外的顶部偏移量,以完美匹配第一个元素的位置。 let topOffest = CGPointMake(0, -(self.collectionView?.contentInset.top ?? O))
self.collectionView?.setContentOffset(topOffest, animated: true)
干杯!
在这种情况下,可以采用以下方法- 在tableView的cellForRowAt函数中, let cell = //使用deque声明一个单元格 cell.myCollectionView.contentOffset = CGPoint(x:0,y:0)