115

コレクション ビューをロードする前に、ユーザーはコレクション ビューの配列に画像の数を設定します。すべてのセルが画面に収まりません。30 個のセルがあり、画面には 6 個しかありません。

質問: UICollectionView のロード時に目的の画像を含むセルに自動的にスクロールする方法は?

4

9 に答える 9

181

新しい、編集された回答:

これを追加viewDidLayoutSubviews

迅速

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    let indexPath = IndexPath(item: 12, section: 0)
    self.collectionView.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: true)
}

通常、.centerVerticallyそうですか

オブジェクトC

-(void)viewDidLayoutSubviews {
   [super viewDidLayoutSubviews];
    NSIndexPath *indexPath = [NSIndexPath indexPathForItem:12 inSection:0];
   [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically | UICollectionViewScrollPositionCenteredHorizontally animated:NO];
}

古いiOSで機能する古い回答

これを追加しviewWillAppearます:

[self.view layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
于 2013-04-13T09:01:16.377 に答える
104

viewWillAppearコレクション ビューのレイアウトがまだ完了していないため、スクロールが確実に機能しない可能性があることがわかりました。間違った項目にスクロールする可能性があります。

また、スクロールインviewDidAppearすると、スクロールされていないビューの瞬間的なフラッシュが表示されることもわかりました。

また、 を毎回スクロールするviewDidLayoutSubviewsと、コレクション レイアウトによってはスクロールするたびにサブビュー レイアウトが発生するため、ユーザーは手動でスクロールできません。

確実に動作することがわかったのは次のとおりです。

目標 C :

- (void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    // If we haven't done the initial scroll, do it once.
    if (!self.initialScrollDone) {
        self.initialScrollDone = YES;
    
        [self.collectionView scrollToItemAtIndexPath:self.myInitialIndexPath
                                    atScrollPosition:UICollectionViewScrollPositionRight animated:NO];
    }
}

スウィフト:

 override func viewWillLayoutSubviews() {

    super.viewWillLayoutSubviews()

      if !self.initialScrollDone {

         self.initialScrollDone = true
         self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)
    }

}
于 2014-10-08T00:38:33.127 に答える
13

迅速:

your_CollectionView.scrollToItemAtIndexPath(indexPath, atScrollPosition: UICollectionViewScrollPosition.CenteredHorizontally, animated: true)

スイフト3

let indexPath = IndexPath(row: itemIndex, section: sectionIndex)

collectionView.scrollToItem(at: indexPath, at: UICollectionViewScrollPosition.right, animated: true)

スクロール位置:

UICollectionViewScrollPosition.CenteredHorizontally / UICollectionViewScrollPosition.CenteredVertically
于 2015-12-11T07:27:30.987 に答える
12

これは私にとってはうまくいくようで、別の答えに似ていますが、いくつかの明確な違いがあります:

- (void)viewDidLayoutSubviews
{     
   [self.collectionView layoutIfNeeded];
   NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
   NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
   NSIndexPath *nextItem = [NSIndexPath indexPathForItem:someInt inSection:currentItem.section];

   [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES];
}
于 2015-05-28T18:56:01.213 に答える
10

GCD を使用して、viewDidLoad のメイン実行ループの次の繰り返しにスクロールをディスパッチして、この動作を実現できます。スクロールはコレクション ビューが画面に表示される前に実行されるため、点滅はしません。

- (void)viewDidLoad {
    dispatch_async (dispatch_get_main_queue (), ^{
        NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
        [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
    });
}
于 2016-05-21T12:37:53.900 に答える
7

上記の代替として。データのロード後に呼び出す:

迅速

collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .right)
于 2019-09-11T14:44:01.487 に答える