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.
By far this is the best approach i have encountered, the trick is to scroll to the frame which is containing next objects. Please refer the code
Here are the Swift versions
Swift 2.x:
Swift 3.x
Swift 4.1 answer
Change the scroll position according to your requirement and also the row count you want to skip (Here i have skipped
visibleItems.count
)Assuming your collectionView contains only 1 section, and given that each item occupies the whole frame then you could do something like this;