UICollectionView auto scroll to cell at IndexPath UICollectionView auto scroll to cell at IndexPath ios ios

UICollectionView auto scroll to cell at IndexPath


New, Edited Answer:

Add this in viewDidLayoutSubviews

SWIFT

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

Normally, .centerVertically is the case

ObjC

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

Old answer working for older iOS

Add this in viewWillAppear:

[self.view layoutIfNeeded];[self.collectionView scrollToItemAtIndexPath:indexPath atScrollPosition:UICollectionViewScrollPositionCenteredVertically animated:NO];


I've found that scrolling in viewWillAppear may not work reliably because the collection view hasn't finished it's layout yet; you may scroll to the wrong item.

I've also found that scrolling in viewDidAppear will cause a momentary flash of the unscrolled view to be visible.

And, if you scroll every time through viewDidLayoutSubviews, the user won't be able to manually scroll because some collection layouts cause subview layout every time you scroll.

Here's what I found works reliably:

Objective 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];    }}

Swift :

 override func viewWillLayoutSubviews() {    super.viewWillLayoutSubviews()      if (!self.initialScrollDone) {         self.initialScrollDone = true         self.testNameCollectionView.scrollToItem(at:selectedIndexPath, at: .centeredHorizontally, animated: true)    }}


I totally agree with the above answer. The only thing is that for me the solution was set the code in viewDidAppear

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

When I used the viewWillAppear the scrolling didn't work.