Cómo recibir toques en un UICollectionView en el espacio en blanco alnetworkingedor de todas las celdas

Tengo una UICollectionView que tiene diferentes elementos en ella. Cuando toco un artículo, utilizo:

  -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

para averiguar qué fue tocado y, básicamente, establecer el alfa de esa vista en 0 para ocultarlo. Todo funciona bien. Ahora, lo que me gustaría hacer es tocar el espacio en blanco que rodea a todas las UICollectionViewCell todas las vistas volverán a aparecer. Estoy teniendo problemas para encontrar un método que me permita saber cuándo se ha tocado el espacio en blanco alnetworkingedor de las celdas. ¿Hay una buena manera de hacerlo? He intentado configurar un reconocedor de gestos, pero cuando lo hago, mi método

  -(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath 

no se llama ¿Hay alguna forma de simplemente implementar el reconocimiento de gestos y desde allí determinar si se ha tocado una celda y si es así esconder esa celda, si no, mostrar todas las celdas ocultas? Gracias.

Me las arreglé para solucionar este problema usando UITapGestureRecognizer en UICollectionView backgroundView . Está en Swift, pero la idea es clara:

 self.tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "handleTap:") self.tapGestureRecognizer.delegate = self self.collectionView.backgroundView = UIView(frame:self.collectionView.bounds) self.collectionView.backgroundView!.addGestureRecognizer(tapGestureRecognizer) 

Y la callback:

 func handleTap(recognizer: UITapGestureRecognizer) { // Handle the tap gesture } 

Me encontré con un escenario similar en mi proyecto y lo resolví haciendo lo siguiente:

 let tapGestureRecogniser = UITapGestureRecognizer(target: self, action: #selector(handleTapEmptySpaceGesture)) tapGestureRecogniser.delegate = self collectionView.addGestureRecognizer(tapGestureRecogniser) 

Implementar el protocolo UIGestureRecognizerDelegate

Luego implementa la siguiente function en el protocolo:

 func gestureRecognizerShouldBegin(gestureRecognizer: UIGestureRecognizer) -> Bool { // only handle tapping empty space (ie not a cell) let point = gestureRecognizer.locationInView(collectionView) let indexPath = collectionView.indexPathForItemAtPoint(point) return indexPath == nil } 

Básicamente, si el clic está en una celda, entonces su reconocimiento de gestos no comienza, lo que permite la selección normal / anular la selección de delegates para ejecutarse. De lo contrario, si está en un espacio vacío, su reconocedor maneja el toque y ejecuta su manejador.

El método del delegado didSelectItem solo se llamará cuando el usuario select collectionViewCell. El espacio entre las celdas puede variar según el tamaño de cada celda, puede especificar solo el espacio mínimo. Para recibir los toques, mantenga la vista complementaria como backgroundView cambiando su zindex, agregue detección táctil a ella. Espero que esto te ayudará. 🙂

Esto funcionó para mí en Swift 2.3

Paso 1: implementar el protocolo UIGestureRecognizerDelegate

Paso 2: Establezca UITapGestureRecognizer en la vista de background UICollectionView

Paso 3: maneje qué hacer con el toque dentro de la function handleTap

 class namScreenVcc: UICollectionViewController, UIViewControllerTransitioningDelegate, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() let tapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(handleTap(_:))) tapGestureRecognizer.delegate = self collectionView!.backgroundView = UIView(frame: collectionView!.bounds) collectionView!.backgroundView!.addGestureRecognizer(tapGestureRecognizer) } func handleTap(recognizer: UITapGestureRecognizer) { // Handle the tap gesture } }