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.