J'ai un UICollectionView qui a à peu près la taille de l'écran. Les UICollectionViewCells qu'il affiche ont la même taille que collectionView. Chaque cellule a un UIImage qui est la taille de la cellule. La pagination est activée sur CollectionView. Il s'agit donc essentiellement d'un diaporama de photos en plein écran que l'utilisateur peut parcourir.
Le problème est que-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
n’est appelé que si l’utilisateur tape avec une main sur une cellule ou appuie longuement avec un doigt puis relâche. Il ne semble pas avoir le comportement par défaut de la sélection d'une seule touche. Je n'ai apporté aucune modification au programme de reconnaissance de gestes CollectionView, j'ai donc du mal à trouver une solution à ce problème.
Êtes-vous sûr de ne pas surcharger accidentellement - (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
? "Sélectionner" et "désélectionner" m'ont déjà déclenché avec l'achèvement du code de Xcode.
J'avais juste le même problème et il s'est avéré qu'il y avait un UITapGestureRecognizer
sur le UIView
contenant le UICollectionView
et qu'il répondait à la place.
Cela explique pourquoi didSelectItemAtIndexPath
ne fonctionne que si l'utilisateur tape avec deux doigts ou appuie longuement avec un doigt car cela ne déclenche pas le UITapGestureRecognizer
.
Donc, vérifiez tous les UITapGestureRecognizer
que vous avez obtenus, pas nécessairement directement sur le UICollectionView
, mais cela pourrait être sur tout UIView
le contenant.
Si vous avez une vue sur la cellule qui obstrue la vue du contenu des cellules qui est intraitable, vous ne pourrez pas vous connecter au rappel de délégué pour la cellule.
Vous voudrez désactiver l'interaction utilisateur sur la vue obstruant, soit dans la carte NIB, soit dans le code.
view.userInteractionEnabled = NO;
Ajoutez simplement à la question déjà résolue une situation supplémentaire dans laquelle le geste de tapoter pourrait ne pas fonctionner, car cela ne cessait de me tourmenter.
Si vous renvoyez false
dans UICollectionViewDelegate'
s collectionView:shouldHighlightItemAtIndexPath:
, le geste de toucher ne fonctionnera pas et le collectionView:didSelectItemAtIndexPath:
ne sera pas appelé. La valeur de retour par défaut de cette méthode de délégation est true
. Vous ne rencontrerez donc pas le problème si vous ne l'implémentez pas délibérément.
Je viens de rencontrer ce problème moi-même. À l’origine, j’avais des boutons et des étiquettes, puis j’ai remanié mon interface utilisateur et transformé ces boutons/étiquettes en cellules pour un UICollectionView
.
J'ai finalement réalisé que les boutons consommaient mes taps. Je venais inconsciemment de placer mes boutons d'origine dans la cellule et de ne pas le transformer en une UIImage
droite. J'avais détruit les boutons associés aux actions et je cherchais juste une sélection de cellule, alors je pris un peu de temps pour le comprendre.
Rétrospectivement stupide et évident, mais il m'a fallu quelques heures pour comprendre ce que j'avais fait.
Si vous utilisez uniquement didselect:
self.collectionView.allowsMultipleSelection = false
Ou supprimez cette ligne.
Je viens d'avoir le même problème ... J'étais en train de passer outre dans la vue CollectionCell et cela a empêché le didSelectItemAtIndexPath de se déclencher lorsque j'ai touché la cellule. Suppression du remplacement et tout a fonctionné.
J'ai rencontré ce problème dans Swift 3 et xcode 8. J'avais une vue et une vue de collection à l'intérieur de cela. implémentation personnalisée dans cette méthode, donc je n'ai pas remplacé cette méthode.Après avoir ajouté le code ci-dessous, la méthode didSelectItem est appelée.
func collectionView(_ collectionView: UICollectionView, shouldHighlightItemAt indexPath: IndexPath) -> Bool {
return true
}
Je suis tombé par hasard sur ce problème, et cela m’a frustré un jour jusqu’à ce que j’ai trouvé ceci Vous devez simplement décocher "Interaction utilisateur activée" Lorsque j'ai sélectionné la cellule en haut à gauche dans CollectionView dans Storyboard. et problème résolu
J'ai rencontré un problème similaire et le coupable s'est révélé être le CardView que j'utilisais dans la hiérarchie de UICollectionView Cell. Dès que j'ai désactivé l'interaction utilisateur pour CardView, collectionView a commencé à répondre aux événements tactiles.
Dans mon cas c'était juste
self.collectionView.allowsSelection =NO;
J'ai eu dans le code.
changer pour
self.collectionView.allowsSelection =YES;
répare le.
Essayez de supprimer toutes vos UIGestures de la vue, puis testez pour voir si les cellules UICollectionView peuvent être utilisées normalement.
Dans mon cas, j'ai dû enlever les lignes:
let tap = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
self.view.addGestureRecognizer(tap)
Au cas où ça aiderait, ça me mordrait de façon idiote de passer quelques heures. Vérifiez si votre cellule personnalisée est en sous-classe UICollectionViewCell au lieu de, disons, UICollectionReusableView ????