I'm using CardsCollectionViewLayout in my code via Swift Bridging for my CollectionView.

Objective-C (Not Working)

My issue is that IndexPath is returning wrong Item index. Here is the minimal code:

- (void)viewDidLoad { [super viewDidLoad]; self.collectionViewEvents.collectionViewLayout = [[CardsCollectionViewLayout alloc] init]; self.collectionViewEvents.dataSource = self; self.collectionViewEvents.delegate = self; self.collectionViewEvents.pagingEnabled = YES; self.collectionViewEvents.showsHorizontalScrollIndicator = NO; [self load]; } // Issue visible here, the indexPath.item is not correct - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { for (UICollectionViewCell *cell in self.collectionViewEvents.visibleCells) { NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell]; NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item); return; } } - (void)load { // self.eventData is declares as: @property (nonatomic) NSArray *eventData; self.eventData = [[NSArray alloc] initWithObjects:UIColor.blackColor, UIColor.whiteColor, UIColor.brownColor, nil]; [[self collectionViewEvents] reloadData]; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"CollectionViewCellReuseIdentifier" forIndexPath:indexPath]; cell.layer.cornerRadius = 7.0; cell.backgroundColor = UIColor.blackColor; return cell; } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return self.eventData.count; }

Result (notice how both 1st and 2nd cell has same IndexPath Item):

2020-03-19 14:48:05.334905+0100 App[7422:2617858] Visible Cell IndexPath Item 2 # => 3rd cell 2020-03-19 14:48:05.741805+0100 App[7422:2617858] Visible Cell IndexPath Item 1 # => 2nd cell 2020-03-19 14:48:06.184932+0100 App[7422:2617858] Visible Cell IndexPath Item 1 # => 1st cell

Swift (Working)

I tried this Example from his code Repository, which has declared colors statically:

var colors: [UIColor] = [ UIColor(red: 237, green: 37, blue: 78), UIColor(red: 249, green: 220, blue: 92), UIColor(red: 194, green: 234, blue: 189), UIColor(red: 1, green: 25, blue: 54), UIColor(red: 255, green: 184, blue: 209) ] ... func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "CollectionViewCellReuseIdentifier", for: indexPath) cell.layer.cornerRadius = 7.0 cell.backgroundColor = .black return cell }

And after implementing this code below, it returns proper IndexPath.

// Issue NOT visible here, the indexPath.item IS correct func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) { for cell in collectionView.visibleCells { let indexPath = collectionView.indexPath(for: cell) print(indexPath?.item) return } }

Result:

2020-03-19 14:48:05.334905+0100 App[7422:2617858] Visible Cell IndexPath Item 2 # => 3rd cell 2020-03-19 14:48:05.741805+0100 App[7422:2617858] Visible Cell IndexPath Item 1 # => 2nd cell 2020-03-19 14:48:06.184932+0100 App[7422:2617858] Visible Cell IndexPath Item 0 # => 1st cell

What am I doing wrong in my Objective-C code?

Things I've tried

// 1st cell has index 1, instead of 0 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { for (UICollectionViewCell *cell in [[self collectionViewEvents] visibleCells]) { NSIndexPath *indexPath = [[self collectionViewEvents] indexPathForCell:cell]; NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item); return; }

// 1st cell has index 1, instead of 0 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { NSArray *visible = [self.collectionViewEvents indexPathsForVisibleItems]; NSIndexPath *indexPath = [visible firstObject]; NSLog(@"Visible Cell IndexPath Item %ld", indexPath.item); return;