xcode CollectionViewController scrollToItemAtIndexPath not working xcode CollectionViewController scrollToItemAtIndexPath not working xcode xcode

xcode CollectionViewController scrollToItemAtIndexPath not working


Whether it's a bug or a feature, UIKit throws this error whenever scrollToItemAtIndexPath:atScrollPosition:Animated is called before UICollectionView has laid out its subviews.

As a workaround, move your scrolling invocation to a place in the view controller lifecycle where you're sure it has already computed its layout, like so:

@implementation CollectionViewControllerSubclass- (void)viewWillAppear:(BOOL)animated{    [super viewWillAppear:animated];    // scrolling here doesn't work (results in your assertion failure)}- (void)viewDidLayoutSubviews{    [super viewDidLayoutSubviews];    NSIndexPath *indexPath = // compute some index path    // scrolling here does work    [self.collectionView scrollToItemAtIndexPath:indexPath                                atScrollPosition:UICollectionViewScrollPositionCenteredHorizontally                                        animated:YES];}@end

At the very least, the error message should probably be more helpful. I've opened a rdar://13416281; please dupe.


If you are trying to scroll when the view controller is loading, make sure to call layoutIfNeeded on the UICollectionView before you call scrollToItemAtIndexPath. This is better than putting the scroll logic in viewDidLayoutSubviews because you won't perform the scroll operation every time the parent view's subviews are laid out.


Sometimes collectionView(_:didSelectItemAt:) is either not called on the main thread, or blocks it, causing scrollToItem(at:at:animated:) to not do anything.

Work around this by doing:

DispatchQueue.main.async {  collectionView.scrollToItem(at: indexPath, at: .centeredHorizontally, animated: true)}