コレクションビューをロードする前に、ユーザーはコレクションビューの配列に画像の数を設定します。すべてのセルが画面に収まりません。画面には30個のセルがあり、6個しかありません。
質問:UICollectionViewのロード時に、目的の画像を含むセルに自動的にスクロールする方法は?
コレクションビューをロードする前に、ユーザーはコレクションビューの配列に画像の数を設定します。すべてのセルが画面に収まりません。画面には30個のセルがあり、6個しかありません。
質問:UICollectionViewのロード時に、目的の画像を含むセルに自動的にスクロールする方法は?
回答:
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)
}
}
[self.collectionView layoutIfNeeded];
前に呼び出す必要がありましたviewDidLoad
。これは、内でこれを行うときにも機能します。
新しい、編集された回答:
これを追加 viewDidLayoutSubviews
迅速
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let indexPath = IndexPath(item: 12, section: 0)
self.collectionView.scrollToItem(at: indexPath, at: [.centeredVertically, .centeredHorizontally], animated: true)
}
通常、.centerVertically
そうです
ObjC
-(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];
indexPath
:[NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber]
上記の回答に完全に同意します。唯一のことは、私にとってはソリューションがviewDidAppearにコードを設定したことです
viewDidAppear
{
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}
viewWillAppearを使用したときに、スクロールが機能しませんでした。
これは私にとってはうまくいくようで、別の答えと似ていますが、いくつかの明確な違いがあります:
- (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];
}
迅速:
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
GCDを使用して、viewDidLoadのメイン実行ループの次の反復にスクロールをディスパッチして、この動作を実現できます。スクロールは、コレクションビューが画面に表示される前に実行されるため、点滅はありません。
- (void)viewDidLoad {
dispatch_async (dispatch_get_main_queue (), ^{
NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
});
}
そうすることをお勧めします。collectionView: willDisplay:
そうすると、コレクションビューのデリゲートが確実に何かを提供するようになります。ここに私の例:
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
/// this is done to set the index on start to 1 to have at index 0 the last image to have a infinity loop
if !didScrollToSecondIndex {
self.scrollToItem(at: IndexPath(row: 1, section: 0), at: .left, animated: false)
didScrollToSecondIndex = true
}
}
ここですべての答え-ハック。私はrelaodDataの後のどこかでコレクションビューをスクロールするためのより良い方法を見つけました
。
例:https : //stackoverflow.com/a/34192787/1400119
initialScrollDone
LenKが行ったようにフラグを使用することを強調します。このメソッドは複数回呼び出され、scrollToItemAtIndexPathを呼び出すと、collectionViewをスクロールできないように見えるようになるためです(iOSシミュレーターiPhone 5 / iOS 8)