55

UICollectionView私は正常に動作し、スクロールする水平を持っています。アイテムをタップすると、データが更新され、 が呼び出されますreloadData。これは機能し、新しいデータが に表示されますUICollectionView。問題は、スクロール位置が変わらず、最後の場所を表示していることです。スクロールを一番上にリセットしたい(または私の場合は左に)。これどうやってするの?

4

9 に答える 9

174

あなたがしたいsetContentOffset:。CGPointMake を使用して任意に設定できる引数として CGPoint を取りますが、コレクションの最初に戻りたい場合は、単に CGPointZero を使用できます。

[collectionView setContentOffset:CGPointZero animated:YES];
于 2013-03-20T10:25:20.200 に答える
34

このメソッドを使用して、必要な項目までスクロールできます。

- (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath 
               atScrollPosition:(UICollectionViewScrollPosition)scrollPosition 
                       animated:(BOOL)animated
于 2013-03-20T10:25:52.533 に答える
23

私はこれをアプリのさまざまな部分で頻繁に使用するため、UIScrollView を拡張して、任意のスクロール ビューおよびスクロール ビュー サブクラスで使用できるようにしました。

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

したがって、位置をリセットする必要があるときはいつでも:

self.collectionView.resetScrollPositionToTop()
于 2015-10-30T11:38:06.603 に答える
13

スウィフトの場合:

collectionView.setContentOffset(CGPointZero, animated: true)

コレクション ビューを格納するビューを離れる場合は、2 番目のビュー コントローラーで変更を行い、戻ったときにコレクション ビューを更新する必要があります。

@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 がテーブルをトップに戻すようにするため、アンワインドは素晴らしいです。

于 2015-09-01T07:56:24.687 に答える
6

私の場合、CGPointZero はコレクション ビューのコンテンツをシフトしました。これは、コンテンツ インセットをカウントしていないためです。これは私のために働いたものです:

    CGPoint topOffest = CGPointMake(0,-self.collectionView.contentInset.top);
    [self.collectionView setContentOffset:topOffest animated:YES];
于 2016-07-14T08:05:26.127 に答える
4

申し訳ありませんが、この記事の執筆時点ではコメントできませんでしたが、UINavigationController を使用していて、CGPointZeroそれ自体ではトップに到達できなかったため、代わりに次を使用する必要がありました。

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

これが将来誰かに役立つことを願っています。乾杯!

于 2014-07-14T12:05:55.777 に答える
2

UINavigationControllerおよび透明なナビゲーション バーを処理するには、最初の要素の位置に完全に一致するように追加の上部オフセットを計算する必要がありました。

スウィフト 1.1 コード:

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

乾杯!

于 2015-05-15T08:15:30.627 に答える