Detectar toque en el "espacio vacío" de UIView

Tengo una jerarquía de vista que se parece a eso

UIScrollView | +- UIView | +- UITextField +- UITextField +- UIButton 

Lo que quiero es que el usuario toque un campo de text y vea el keyboard en la pantalla para poder tocar un "espacio vacío" de UIView para ocultar el keyboard. Por lo tanto, no quiero, por ejemplo, un evento de UIButton hacer burbujas hasta UIView (eso es exactamente lo que sucede si agrego UITapGestureRecognizer a UIView).

¿Cómo puedo lograr la funcionalidad deseada?

En su método viewDidLoad , agregue este reconocedor de gestos:

 UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; gestureRecognizer.cancelsTouchesInView = NO; [self.view addGestureRecognizer:gestureRecognizer]; 

A continuación, agregue el método dismissKeyboard :

 - (void) dismissKeyboard{ [YOURFIELDHERE resignFirstResponder]; } 

También debe agregar esto para que los botones se puedan hacer clic y no se anulen por el reconocedor de gestos:

 gestureRecognizer.delegate = self; // in viewDidLoad <UIGestureRecognizerDelegate> //in your header file - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { if ([touch.view isKindOfClass:[UIButton class]]){ return NO; } return YES; // handle the touch } 

Me encuentro con este mismo problema y lo resuelvo con una solución ingenua.

  1. Cambie la vista de una instancia de UIView a una instancia de UIControl para que pueda manejar events táctiles.
  2. Cree un método IBAction en el controller de vista que maneja el evento táctil. En este caso, renunciaremos a la primera respuesta de las subvistas de la vista.

    - (IBAction)backgroundTapped:(id)sender { [contentView endEditing:YES]; }

    contentView es solo la variable de instancia que apunta a la Vista. Puedes nombrarlo todo lo que quieras. Cuando endEditing el post endEditing a la vista, básicamente le dice a sus subvistas que renuncien al primer respondedor, y así descartan el keyboard.

  3. Conecte el objective (Ver) y la acción (método IBAction que acaba de crear) a través de Interface Builder, abriendo el connection inspector de connection inspector de la Vista, select Touch Up Inside y arrástrelo al object Propietario del file, luego select el nombre del método.

Espero que sea de ayuda.

Sé que es un poco tarde, pero una solución rápida y sencilla es la siguiente:

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ [self.view endEditing:YES]; } 

Se llamará si toca cualquier espacio vacío.