UICollectionView current visible cell index UICollectionView current visible cell index objective-c objective-c

UICollectionView current visible cell index


indexPathsForVisibleItems might work for most situations, but sometimes it returns an array with more than one index path and it can be tricky figuring out the one you want. In those situations, you can do something like this:

CGRect visibleRect = (CGRect){.origin = self.collectionView.contentOffset, .size = self.collectionView.bounds.size};CGPoint visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect));NSIndexPath *visibleIndexPath = [self.collectionView indexPathForItemAtPoint:visiblePoint];

This works especially well when each item in your collection view takes up the whole screen.

Swift version

let visibleRect = CGRect(origin: collectionView.contentOffset, size: collectionView.bounds.size)let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)let visibleIndexPath = collectionView.indexPathForItem(at: visiblePoint)


The method [collectionView visibleCells] give you all visibleCells array you want. Use it when you want to get

- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{    for (UICollectionViewCell *cell in [self.mainImageCollection visibleCells]) {        NSIndexPath *indexPath = [self.mainImageCollection indexPathForCell:cell];        NSLog(@"%@",indexPath);    }}

Update to Swift 5:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {    for cell in yourCollectionView.visibleCells {        let indexPath = yourCollectionView.indexPath(for: cell)        print(indexPath)    }}


Swift 5:

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {    var visibleRect = CGRect()    visibleRect.origin = collectionView.contentOffset    visibleRect.size = collectionView.bounds.size    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)    guard let indexPath = collectionView.indexPathForItem(at: visiblePoint) else { return }     print(indexPath)}

Working Answers Combined In Swift 2.2 :

 func scrollViewDidEndDecelerating(scrollView: UIScrollView) {        var visibleRect = CGRect()        visibleRect.origin = self.collectionView.contentOffset        visibleRect.size = self.collectionView.bounds.size        let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))        let visibleIndexPath: NSIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)        guard let indexPath = visibleIndexPath else { return }         print(indexPath)    }