How to scroll UICollectionViewCell programmatically in IOS?

ios, objective-c, uicollectionview, uicollectionviewcell, uiscrollview

Solution

Assuming your collectionView contains only 1 section, and given that each item occupies the whole frame then you could do something like this;

  NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems];
  NSIndexPath *currentItem = [visibleItems objectAtIndex:0];
  NSIndexPath *nextItem = [NSIndexPath indexPathForItem:currentItem.item + 1 inSection:currentItem.section];
  [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionTop animated:YES];

Problem

I have a vertical `UICollectionView` with each cell taking up the entire `self.view.frame` I can easily swipe upwards to page to the next cell, but I would like to do the same thing with the press of a button. I've tried using: ``` - (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated ``` And: ``` - (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated ``` They work but they temporarily "White-Out" the currentCell to present the nextCell, while the swiping shows both cells during the transition. Ideally I would like to use: ``` - (void)scrollToItemAtIndexPath:(NSIndexPath *)indexPath atScrollPosition:(UICollectionViewScrollPosition)scrollPosition animated:(BOOL)animated ``` But I don't know how to access the nextCell's `indexPath`... I've tried: ``` NSIndexPath *nextIndexPath = [_collectionView indexPathForItemAtPoint:CGPointMake(25, (_collectionView.frame.size.height-25)*(_currentIndexRowForCellOnScreen+1))]; ``` Where `_currentIndexRowForCellOnScreen` is the `indexPath.row` of the `UICollectionView`'s first appearance on screen in: ``` - (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath ``` But when I put it into: ``` - (NSIndexPath *)indexPathForCell:(UICollectionViewCell *)cell ``` it returns NULL after the first Cell, and does not animate.... Any direction would be greatly appreciated. Thank you for your time.

Original source