UICollectionViewの現在の表示セルインデックス 質問する

UICollectionViewの現在の表示セルインデックス 質問する

UICollectionViewiPad アプリケーションで初めて使用しています。UICollectionViewアプリケーションのサイズとセルのサイズが同じになるように設定しました。つまり、一度に表示されるセルは 1 つだけです。

問題:ユーザーがスクロールするときに、UICollectionViewどのセルが表示されているかを知る必要があり、変更時に他の UI 要素を更新する必要があります。このためのデリゲート メソッドは見つかりませんでした。どうすればこれを実現できますか?

コード:

[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?

ベストアンサー1

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];

これは、コレクション ビュー内の各アイテムが画面全体を占める場合に特に効果的です。

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)

おすすめ記事