我第一次在我的 iPad 应用程序中使用 UICollectionView
。
我已设置 UICollectionView
使其大小和单元格大小相同,意味着一次只显示一次单元格。
问题:
现在,当用户滚动 UICollectionView
时,我需要知道哪个单元格可见,我必须在更改时更新其他 UI 元素。我没有找到任何委托(delegate)方法。我怎样才能做到这一点?
代码:
[self.mainImageCollection setTag:MAIN_IMAGE_COLLECTION_VIEW];
[self.mainImageCollection registerClass:[InspirationMainImageCollectionCell class] forCellWithReuseIdentifier:@"cellIdentifier"];
[self.mainImageFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
[self.mainImageFlowLayout setMinimumInteritemSpacing:0.0f];
[self.mainImageFlowLayout setMinimumLineSpacing:0.0f];
self.mainImageFlowLayout.minimumLineSpacing = 0;
[self.mainImageCollection setPagingEnabled:YES];
[self.mainImageCollection setShowsHorizontalScrollIndicator:NO];
[self.mainImageCollection setCollectionViewLayout:self.mainImageFlowLayout];
我尝试过的:
由于 UICollectionView
符合 UIScrollView
,当用户滚动以 UIScrollViewDelegate
方法结束时我得到了
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
但是在上面的函数中,我怎样才能得到 UICollectionView
的当前可见单元格索引?
最佳答案
indexPathsForVisibleItems
可能适用于大多数情况,但有时它会返回一个包含多个索引路径的数组,并且很难找出你想要的那个。在这些情况下,您可以执行以下操作:
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];
当您的收藏 View 中的每个项目都占据整个屏幕时,这尤其适用。
Swift 版本
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)
https://stackoverflow.com/questions/18649920/