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 ?

14voto

Mr Stanev Points 830

Il sera probablement préférable d'utiliser les méthodes UICollectionViewDelegate : (Swift 3)

// Called before the cell is displayed    
func collectionView(_ collectionView: UICollectionView, willDisplay cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    print(indexPath.row)
}

// Called when the cell is displayed
func collectionView(_ collectionView: UICollectionView, didEndDisplaying cell: UICollectionViewCell, forItemAt indexPath: IndexPath) {
    print(indexPath.row)
}

11voto

Anil Kukadeja Points 771

Swift 3.0

La solution la plus simple qui vous donnera indexPath pour les cellules visibles

yourCollectionView.indexPathsForVisibleItems 

retournera le tableau d'indexpath.

Il suffit de prendre le premier objet du tableau comme ceci.

yourCollectionView.indexPathsForVisibleItems.first

J'imagine que cela devrait aussi fonctionner avec l'Objective - C.

10voto

user1105951 Points 851

Je veux juste ajouter pour les autres : pour une raison quelconque, je n'ai pas obtenu la cellule qui était visible pour l'utilisateur lorsque j'ai fait défiler jusqu'à précédent cellule dans le collectionView avec pagingEnabled.

J'ai donc inséré le code à l'intérieur de dispatch_async pour lui donner un peu d'"air". et cela fonctionne pour moi.

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    dispatch_async(dispatch_get_main_queue(), ^{
            UICollectionViewCell * visibleCell= [[self.collectionView visibleCells] objectAtIndex:0];

            [visibleCell doSomthing];
        });
}

9voto

Hiren Panchal Points 1819

Pour Swift 3.0

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let visibleRect = CGRect(origin: colView.contentOffset, size: colView.bounds.size)
    let visiblePoint = CGPoint(x: visibleRect.midX, y: visibleRect.midY)
    let indexPath = colView.indexPathForItem(at: visiblePoint)
}

4voto

En convertissant la réponse d'@Anthony à Swift 3.0 a parfaitement fonctionné pour moi :

func scrollViewDidScroll(_ scrollView: UIScrollView) {

    var visibleRect = CGRect()
    visibleRect.origin = yourCollectionView.contentOffset
    visibleRect.size = yourCollectionView.bounds.size
    let visiblePoint = CGPoint(x: CGFloat(visibleRect.midX), y: CGFloat(visibleRect.midY))
    let visibleIndexPath: IndexPath? = yourCollectionView.indexPathForItem(at: visiblePoint)
    print("Visible cell's index is : \(visibleIndexPath?.row)!")
}

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