2013-04-13 50 views
76

コレクションビューを読み込む前に、コレクションビューの配列にイメージの数を設定します。すべてのセルが画面に収まらない。私は30の細胞と6つの画面しか持っていません。UICollectionViewインデックスパスのセルに自動スクロール

質問:UICollectionViewの読み込み時に自動的に目的の画像を含むセルにスクロールする方法はありますか?

答えて

136

新しい、編集回答:

が古い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]; 
+4

これはまさに私が使用しようとしているものです。私は配列内のオブジェクトの番号を持っており、そのオブジェクトの名前を知っています。しかし、正しいindexPathを置く方法を知らない...任意のアイデア? – AlexanderZ

+4

'indexPath'を簡単に作成できます:' [NSIndexPath indexPathForItem:numberOfTheObject inSection:sectionNumber] ' –

+3

いくつかのエラーがありました。しかし、私は(void)viewDidLayoutSubviews {}内にすべての上記のコードを入れて、今それは正常に動作しています。 Thanx Bogdan。 – AlexanderZ

13

私は上記の答えに全く同意します。唯一のことは、私はスクロールが動作しませんでしたviewWillAppearを使用すると私のためのソリューションをviewDidAppear

viewDidAppear 
{ 
    [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:YES]; 
} 

にコードを設定していることです。

+0

私はそれを2番目に! – Mike

+1

viewDidAppearはコレクションビューが動く/点滅しているのを見ているという欠点があります。ビューはすでに(名前が示すように)表示されています...私は本当にAppleがこれほど珍しいケースではなく、viewDidLayoutSubviewsという方法少し厄介です – TheEye

68

私は、コレクションビューがまだレイアウトを完了していないため、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]; 
    } 
} 
+0

ニースのヒント。このメソッドは複数回呼び出され、scrollToItemAtIndexPathを呼び出すとLenokが行ったように 'initialScrollDone'フラグを使用して強調します:collectionViewをスクロールできないようにしているようです(iOSシミュレータiPhone 5/iOS 8) – maz

+1

thxこれは受け入れられる回答でなければなりません – Jakob

+1

iOS8でうまく動作します。受け入れられた答えでなければなりません。 – Nick

11

- (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]; 
} 
10

スウィフトを:

ここ

は、私は確実に作品を見つけたものです

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 
7

あなたは、この動作を実現するためのviewDidLoadで、メイン実行ループの次の反復にスクロールを派遣するGCDを使用することができます。画面上にコレクションビューが表示される前にスクロールが実行されるため、点滅は発生しません。

- (void)viewDidLoad { 
    dispatch_async (dispatch_get_main_queue(), ^{ 
     NSIndexPath *indexPath = YOUR_DESIRED_INDEXPATH; 
     [self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally animated:NO]; 
    }); 
} 
+0

これは私のために働く唯一のアプローチでした –

0

すべての回答がここにあります。私はrelaodDataの後ろでコレクションビューをスクロールするより良い方法を見つけました:
スーパークラスコールの後、メソッドprepareLayoutをオーバーライドして、これまでどんなレイアウトを使っていたのかをサブクラスコレクションビューレイアウト。
例:https://stackoverflow.com/a/34192787/1400119

0

私は、あなたがコレクションビューのデリゲートが何かを提供することを確認することができます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 
    } 
} 
関連する問題