コレクションビューを読み込む前に、コレクションビューの配列にイメージの数を設定します。すべてのセルが画面に収まらない。私は30の細胞と6つの画面しか持っていません。UICollectionViewインデックスパスのセルに自動スクロール
質問:UICollectionViewの読み込み時に自動的に目的の画像を含むセルにスクロールする方法はありますか?
コレクションビューを読み込む前に、コレクションビューの配列にイメージの数を設定します。すべてのセルが画面に収まらない。私は30の細胞と6つの画面しか持っていません。UICollectionViewインデックスパスのセルに自動スクロール
質問:UICollectionViewの読み込み時に自動的に目的の画像を含むセルにスクロールする方法はありますか?
新しい、編集回答:
が古いiOSのために働いてviewDidLayoutSubviews
-(void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
}
旧答えにこれを追加
viewWillAppear
でこれを追加します。
[self.view layoutIfNeeded];
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];
私は上記の答えに全く同意します。唯一のことは、私はスクロールが動作しませんでしたviewWillAppearを使用すると私のためのソリューションをviewDidAppear
viewDidAppear
{
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES];
}
にコードを設定していることです。
私は、コレクションビューがまだレイアウトを完了していないため、viewWillAppearのスクロールが確実に機能しないことがあります。間違った項目にスクロールすることがあります。
私はまた、viewDidAppearでスクロールすると、スクロールしていないビューの瞬間的な点滅が見えることがわかりました。
また、viewDidLayoutSubviewsで毎回スクロールすると、スクロールするたびに一部のコレクションレイアウトでサブビューレイアウトが発生するため、ユーザーは手動でスクロールできなくなります。これは、私のために働くように見えた別の答えとその類似しているが、いくつかの明確な違いがある
- (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];
}
}
:
- (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
あなたは、この動作を実現するためのviewDidLoadで、メイン実行ループの次の反復にスクロールを派遣するGCDを使用することができます。画面上にコレクションビューが表示される前にスクロールが実行されるため、点滅は発生しません。
- (void)viewDidLoad {
dispatch_async (dispatch_get_main_queue(), ^{
NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH;
[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO];
});
}
これは私のために働く唯一のアプローチでした –
すべての回答がここにあります。私はrelaodDataの後ろでコレクションビューをスクロールするより良い方法を見つけました:
スーパークラスコールの後、メソッドprepareLayoutをオーバーライドして、これまでどんなレイアウトを使っていたのかをサブクラスコレクションビューレイアウト。
例:https://stackoverflow.com/a/34192787/1400119
私は、あなたがコレクションビューのデリゲートが何かを提供することを確認することができます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
}
}
これはまさに私が使用しようとしているものです。私は配列内のオブジェクトの番号を持っており、そのオブジェクトの名前を知っています。しかし、正しいindexPathを置く方法を知らない...任意のアイデア? – AlexanderZ
'indexPath'を簡単に作成できます:' [NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber] ' –
いくつかのエラーがありました。しかし、私は(void)viewDidLayoutSubviews {}内にすべての上記のコードを入れて、今それは正常に動作しています。 Thanx Bogdan。 – AlexanderZ