¿Cómo agregar un toque de gesto a UICollectionView, mientras se mantiene la selección de celdas?

Tarea

Agregue un solo gesto de toque a UICollectionView , no interponga en la selección de celdas.

Quiero algunos otros toques en la parte no celular de collectionView.

Código

Usando 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") } 

Resultado

Sí, se interpone en el path ahora. Cuando toca en la celda, registra "tocado".

Análisis

  • Comprobo el valor de retorno de hitTest de collectionView y la celda. Ambos devolvieron la celda tocada, lo que significa que forman una cadena de respuesta de celda -> CollectionView
  • sin gestos en la celda
  • 3 gestos en collectionView, nadie parece funcionar con la celda seleccionada
    • UIScrollViewDelayedTouchesBeganGestureRecognizer
    • UIScrollViewPanGestureRecognizer
    • UITapGestureRecognizer
  • callStack, parece que la selección de celdas tiene una traza de stack diferente con el patrón de acción objective del gesto.
  • el gesto de doble toque funciona junto con la selección de celdas.

Pregunta

No se pudo encontrar más rastro. ¿Alguna idea sobre cómo se implementa la selección celular o para lograr esta tarea?

Siempre que desee agregar un reconocimiento de gestos, pero no robar los toques de la vista de destino, debe establecer UIGestureRecognizer.cancelsTouchesInView para su instancia de gestureRecognizer en false.

En lugar de intentar forzar didSelectItem , puede get indexPath y / o celda de esta manera:

 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") } }