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)}