144 votes

Index de la cellule visible actuelle du UICollectionView

J'utilise UICollectionView pour la première fois dans mon application iPad. J'ai défini UICollectionView de sorte que sa taille et celle de la cellule soient identiques, ce qui signifie qu'une seule cellule est affichée à la fois.

Problème : Maintenant, lorsque l'utilisateur fait défiler UICollectionView J'ai besoin de savoir quelle cellule est visible. Je dois mettre à jour les autres éléments de l'interface utilisateur en cas de changement. Je n'ai pas trouvé de méthode déléguée pour cela. Comment puis-je réaliser cela ?

Code :

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

Ce que j'ai essayé :

Como UICollectionView est conforme à UIScrollView que j'obtiens lorsque le défilement de l'utilisateur se termine par UIScrollViewDelegate méthode

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView

Mais à l'intérieur de la fonction ci-dessus, comment puis-je obtenir l'index de la cellule visible actuelle de l'écran ? UICollectionView ?

2voto

raaz Points 4201

Vous pouvez utiliser scrollViewDidEndDecelerating : pour cela

//@property (strong, nonatomic) IBOutlet UICollectionView *collectionView;

   - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

        for (UICollectionViewCell *cell in [self.collectionView visibleCells]) {
            NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];
            NSUInteger lastIndex = [indexPath indexAtPosition:[indexPath length] - 1];
            NSLog(@"visible cell value %d",lastIndex);
        }

    }

1voto

kuldip Points 46

Dans ce fil de discussion, il y a tellement de solutions qui fonctionnent bien si la cellule occupe tout l'écran mais ils utilisent les limites de la collection de vues et les points médians du rectangle visible. Il existe cependant une solution simple à ce problème.

    DispatchQueue.main.async {
        let visibleCell = self.collImages.visibleCells.first
        print(self.collImages.indexPath(for: visibleCell))
    }

Par ce biais, vous pouvez obtenir l'indexPath de la cellule visible. J'ai ajouté DispatchQueue parce que lorsque vous glissez plus rapidement et si pendant un bref instant la cellule suivante est affichée, sans dispatchQueue vous obtiendrez indexPath de la cellule brièvement affichée et non la cellule qui est affichée à l'écran.

0voto

Hwangho Kim Points 382

C'est une vieille question mais dans mon cas...

- (void) scrollViewWillBeginDragging:(UIScrollView *)scrollView {

    _m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.firstObject].row;
}

- (void) scrollViewDidEndDecelerating:(UIScrollView *)scrollView {
    _m_offsetIdx = [m_cv indexPathForCell:m_cv.visibleCells.lastObject].row;
}

0voto

Nik Kov Points 2742

Consultez également cet extrait

let isCellVisible = collectionView.visibleCells.map { collectionView.indexPath(for: $0) }.contains(inspectingIndexPath)

-1voto

Arash Jamshidi Points 103

Essayez ça, ça marche. (dans l'exemple ci-dessous j'ai 3 cellules par exemple).

    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    let visibleRect = CGRect(origin: self.collectionView.contentOffset, size: self.collectionView.bounds.size)
    let visiblePoint = CGPointMake(CGRectGetMidX(visibleRect), CGRectGetMidY(visibleRect))
    let visibleIndexPath = self.collectionView.indexPathForItemAtPoint(visiblePoint)
    if let v = visibleIndexPath {
        switch v.item {
        case 0: setImageDescription()
            break
        case 1: setImageConditions()
            break
        case 2: setImageResults()
            break
        default: break
        }
    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X