コレクション ビューをロードする前に、ユーザーはコレクション ビューの配列に画像の数を設定します。すべてのセルが画面に収まりません。30 個のセルがあり、画面には 6 個しかありません。
質問: UICollectionView のロード時に目的の画像を含むセルに自動的にスクロールする方法は?
コレクション ビューをロードする前に、ユーザーはコレクション ビューの配列に画像の数を設定します。すべてのセルが画面に収まりません。30 個のセルがあり、画面には 6 個しかありません。
質問: UICollectionView のロード時に目的の画像を含むセルに自動的にスクロールする方法は?
新しい、編集された回答:
これを追加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];
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)
}
}
迅速:
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
これは私にとってはうまくいくようで、別の答えに似ていますが、いくつかの明確な違いがあります:
- (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];
}
GCD を使用して、viewDidLoad のメイン実行ループの次の繰り返しにスクロールをディスパッチして、この動作を実現できます。スクロールはコレクション ビューが画面に表示される前に実行されるため、点滅はしません。
- (void)viewDidLoad {
dispatch_async (dispatch_get_main_queue (), ^{
NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
});
}
上記の代替として。データのロード後に呼び出す:
迅速
collectionView.reloadData()
collectionView.layoutIfNeeded()
collectionView.selectItem(at: indexPath, animated: true, scrollPosition: .right)