重置卷轴上UICollectionView(Reset scroll on UICollection

2019-08-17 19:29发布

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

Answer 1:

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

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


Answer 2:

你想setContentOffset: 它需要一个CGPoint的,并且你可以设置你想要使用CGPointMake什么都的说法,但如果你想返回到集合的一开始,你可以简单地使用CGPointZero。

[collectionView setContentOffset:CGPointZero animated:YES];


Answer 3:

我在我的应用程序,所以我只是延长的UIScrollView所以它可以在任何滚动视图中使用,滚动视图子类的不同部分经常使用这样的:

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

所以每当我需要重置的位置:

self.collectionView.resetScrollPositionToTop()


Answer 4:

在斯威夫特:

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将确保该表将重回巅峰。



Answer 5:

因为你不是在数以内容插入CGPointZero在我的情况下转移集合视图的内容。 这是它为我工作:

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


Answer 6:

抱歉,我不能在写这篇文章的时候发表评论,但我是用一个UINavigationController和CGPointZero本身没有让我最顶端,所以我不得不改用以下。

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

希望这可以帮助别人的未来。 干杯!



Answer 7:

如果您查看控制器包含安全区,代码:

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)
    }
}


Answer 8:

为了对付一个UINavigationController和透明的导航栏,我不得不计算额外顶偏完美匹配的第一个元素的位置。

雨燕1.1的代码:

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

干杯!



文章来源: Reset scroll on UICollectionView