Crear una vista UIV que capture tomas, pero es transparente para todos los demás gestos.

Quiero lograr lo siguiente.

Escenario: el keyboard iOS está en pantalla mientras el usuario escribe en un campo de text en particular. El usuario puede tocar cualquier parte fuera del keyboard y el campo de text para descartar el keyboard (sin activar ningún button que esté visible). Además, el usuario puede arrastrar fuera del keyboard y observar el comportamiento de arrastre normal en alguna disposition de vistas desplazables.

Conceptualmente, estoy colocando una UIView "portada" sobre la mayor parte de la pantalla que se comporta de tal manera que:

  1. Si el usuario toca la cubierta, entonces capturo ese toque (para que pueda, por ejemplo, descartar el keyboard). Esto es fácil de lograr interceptando los events táctiles en una subclass UIView o usando un reconocedor de gestos táctil.

  2. Si el usuario arrastra la tapa, la tapa ignora o reenvía estos toques; estos son recibidos por las capas debajo de la misma manera en que hubieran estado sin una cubierta.

Entonces: el usuario debería poder desplazarse por el contenido debajo de la portada, pero no debe tocar el contenido debajo de la portada. Un toque "fuera" del keyboard y el campo de text debe descartar el keyboard (y la cubierta), pero no debe activar nada.

¿Cómo puedo conseguir esto?

Agregue el gesto de toque de la forma habitual:

 UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tapAction:)]; [self.view addGestureRecognizer:tapGesture]; 

Pero lo que puede estar buscando es esto:

  - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { return YES; } 

La documentation dice: Este método se invoca cuando el reconocimiento de un gesto, ya sea por gestureRecognizer u otroGestureRecognizer, bloqueará que el otro gestor reconocedor no reconozca su gesto. ( https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIGestureRecognizerDelegate_Protocol/index.html#//apple_ref/occ/intf/UIGestureRecognizerDelegate )

De esta forma, puede estar seguro de que es totalmente transparente, y también de que nada evitará que se llame a su reconocedor.

1: Agregue un reconocedor de gesto de toque a la vista:

  //Adding tap gesture UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]; tapGesture.numberOfTapsRequinetworking = 1; [self.view addGestureRecognizer:tapGesture]; 

2: En handleTapGesture renuncias PrimerResponedor del keyboard

 - (void)handleTapGesture:(UITapGestureRecognizer *)sender { if (sender.state == UIGestureRecognizerStateRecognized) { //Resign first responder for keyboard here } } 

Elaborado un poco en la respuesta anterior. UIGestureRecognizerStateRecognized se asegura de que los events de una sola pestaña sean reconocidos.

¿Es esta la funcionalidad que tienes después?

Una vista personalizada que reenvía todos los toques que recibe:

 class CustomView: UIView { override func hitTest(point: CGPoint, withEvent event: UIEvent?) -> UIView? { var hitView = super.hitTest(point, withEvent: event) if hitView == self { return nil } return hitView } } 

A partir de ahí, puede ir de diferentes maneras para hacer uso de los gestos de toque. O observe el UIEvent por sus toques, o use un reconocimiento de gestos.