Comment append un geste tapant à UICollectionView, tout en conservant la sélection de cellule?

Tâche

Ajoutez un seul geste à UICollectionView , ne UICollectionView pas la sélection des cellules.

Je veux d'autres taps sur la partie no-cell de la collectionView.

Code

En utilisant XCode8, Swift 3.

 override func viewDidLoad() { ... collectionView.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(tap))) } func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { print(indexPath) } func tap(sender: UITapGestureRecognizer){ print("tapped") } 

Résultat

Oui, ça devient un obstacle maintenant. Lorsque vous appuyez sur la cellule, il se connecte "tapoté".

Une parsing

  • Je vérifie la valeur de return hitTest de la collectionView et de la cellule. Les deux ont renvoyé la cellule tapée, ce qui signifie qu'ils forment une string de réponse de Cell -> CollectionView
  • pas de gestes sur la cellule
  • 3 gestes sur collectionView, personne ne semble travailler avec la cellule select
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • callStack, semble que la sélection de cellule a une trace de stack différente avec le motif cible-action du geste.
  • Le double geste du robinet fonctionne avec la sélection de la cellule.

Question

Impossible de find plus de trace. Des idées sur la façon dont la sélection de cellule est implémentée ou pour accomplir cette tâche?

Chaque fois que vous souhaitez append un outil de reconnaissance de gestes, mais pas les touches de la vue cible, vous devez définir UIGestureRecognizer.cancelsTouchesInView pour votre instance de gestureRecognizer sur false.

Au lieu d'essayer de forcer didSelectItem vous pouvez simplement get l'indexPath et / ou la cellule de cette façon:

 func tap(sender: UITapGestureRecognizer){ if let indexPath = self.collectionView?.indexPathForItem(at: sender.location(in: self.collectionView)) { let cell = self.collectionView?.cellForItem(at: indexPath) print("you can do something with the cell or index path here") } else { print("collection view was tapped") } }