J'utilise pour la UICollectionView
première fois dans mon application iPad. J'ai défini de UICollectionView
telle sorte que sa taille et sa taille de 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 d'autres éléments de l'interface utilisateur en cas de modification. Je n'ai trouvé aucune méthode déléguée pour cela. Comment puis-je atteindre cet objectif?
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é:
Comme UICollectionView
conforme à UIScrollView
, j'ai obtenu lorsque le défilement de l'utilisateur se termine par la UIScrollViewDelegate
méthode
-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
Mais à l'intérieur de la fonction ci-dessus, comment puis-je obtenir l'indice de cellule visible actuel de UICollectionView
???
la source
Réponses:
La méthode [collectionView visibleCells] vous donne tous les tableaux visiblesCells que vous voulez. Utilisez-le lorsque vous voulez obtenir
Mettre à jour vers Swift 5:
la source
scrollViewDidScroll:
méthode déléguée fournit des mises à jour de la vue de défilement chaque fois qu'un défilement se termine (et est probablement un meilleur choix ici). Contrairement à lascrollViewDidEndDecelerating:
méthode déléguée qui n'est appelée que lorsque la vue de défilement " s'arrête [à partir d'un grand défilement] " (voir l'en-tête UIScrollView)...DidScroll
est appelé plusieurs fois, même pendant un court défilement. Cela peut être une bonne chose ou non, selon ce que l'on veut faire.indexPathsForVisibleItems
peut fonctionner dans la plupart des situations, mais il renvoie parfois un tableau avec plus d'un chemin d'index et il peut être difficile de déterminer celui que vous voulez. Dans ces situations, vous pouvez faire quelque chose comme ceci:Cela fonctionne particulièrement bien lorsque chaque élément de votre vue de collection occupe tout l'écran.
Version Swift
la source
visibleIndexPath
seront parfois nulles, alorsif (visibleIndexPath) == nil { let cells = collectionView.visibleCells() let visibleIndexPath = collectionView.indexPathForCell(cells[0] as! UICollectionViewCell)! as NSIndexPath }
Swift 5 :
Réponses pratiques combinées dans Swift 2.2:
la source
Par souci d'exhaustivité, c'est la méthode qui a fini par fonctionner pour moi. C'était une combinaison des méthodes de @Anthony et @ iAn.
la source
Il sera probablement préférable d'utiliser les méthodes UICollectionViewDelegate: (Swift 3)
la source
didEndDisplaying
, à partir de la documentation: indique au délégué que la cellule spécifiée a été supprimée de la vue de collection. Utilisez cette méthode pour détecter lorsqu'une cellule est supprimée d'une vue de collection, au lieu de surveiller la vue elle-même pour voir quand elle disparaît. Donc je ne pense pasdidEndDisplaying
qu'on appelle quand la cellule est affichée.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 je faisais défiler la cellule précédente dans collectionView avec pagingEnabled.
J'insère donc le code dans dispatch_async pour lui donner un peu d '"air" et cela fonctionne pour moi.
la source
DispatchQueue.main.async {
lorsque l'appel commence à partir de quelque chose commefunc tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
willDisplay cell
comme mentionné ci-dessus Je pense que le problème, quelque part dans UIKit, est vraiment le même dans mon cas que cette réponse.la source
Swift 3.0
Solution la plus simple qui vous donnera indexPath pour les cellules visibles.
renverra le tableau de indexpath.
Prenez simplement le premier objet du tableau comme celui-ci.
Je suppose que cela devrait également fonctionner avec Objective-C.
la source
UICollection Afficher l'index de cellule visible actuel: Swift 3
la source
la conversion de la réponse de @ Anthony en Swift 3.0 a parfaitement fonctionné pour moi:
la source
Vous pouvez utiliser
scrollViewDidEndDecelerating
: pour celala source
C'est une vieille question mais dans mon cas ...
la source
Vérifiez également cet extrait
la source
Dans ce fil, il y a tellement de solutions qui fonctionnent bien si la cellule prend le plein écran mais elles utilisent les limites de vue de collection et les points médians de Visible rect Cependant il existe une solution simple à ce problème
par cela, vous pouvez obtenir indexPath de la cellule visible. J'ai ajouté DispatchQueue car lorsque vous glissez plus rapidement et si pendant un bref instant la cellule suivante est affichée, sans dispactchQueue, vous obtiendrez indexPath de la cellule brièvement affichée et non de la cellule affichée à l'écran.
la source
essayez ceci, cela fonctionne. (dans l'exemple ci-dessous, j'ai 3 cellules par exemple.)
la source
Swift 3 et Swift 4:
Si vous souhaitez afficher le nombre réel, vous pouvez ajouter +1
la source