iPhone: descarta el teclado cuando el usuario toca el fondo

He leído algunos otros artículos como aquí y aquí pero desafortunadamente hay algunas diferencias en mi código que no harán que esto funcione (así que no sugiera estas respuestas).

Me gustaría descartar el teclado cuando el usuario toca el fondo. Normalmente esto sería fácil, excepto que mi UITextField los objetos están dentro de un UIScrollView lo que hace que no pueda captar los eventos táctiles (el UIScrollView los traga para que no alcancen la vista base). Una forma de evitar esto es registrarse para un gesto genérico (un toque), pero esto captura todos los toques, incluidos los destinados al botón de enviar.

Básicamente, 'touchesBegan: withEvent:' no funcionará porque nunca se llama, y ​​los gestos no funcionan porque no tienen en cuenta las pulsaciones de botones.

Aquí está la pregunta: ¿hay alguna forma de detectar un simple toque en un UIScrollView? Una vez que detecto el grifo, sé cómo hacer el resto. ¡Gracias!

preguntado el 16 de mayo de 11 a las 20:05

2 Respuestas

No puedes usar touchesBegan:withEvent en la supervista de la vista de desplazamiento, pero ¿qué hay de subclasificar UIScrollView y manejar el toque allí? Luego puede proceder normalmente con una llamada a la implementación de super para evitar pisar los dedos de los pies de UIScrollView:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    /* Insert code to dismiss keyboard if needed */

    // This makes sure scrolling proceeds normally.
    [super touchesBegain:touches withEvent:event];
}

contestado el 17 de mayo de 11 a las 01:05

Por lo tanto, si el usuario solo tocó la pantalla, touches ¿Tiene un tamaño de 1? Además, ¿interferirá esto con los botones de ScrollView? - mtmurdock

La teoría general es que el evento se llamará cada vez que un dedo toque la pantalla. Dado que es teóricamente posible que dos dedos toquen la pantalla en exactamente al mismo tiempo, los toques se pasan como un conjunto. Prácticamente hablando, los toques casi siempre tienen un toque, y los mensajes se envían con una proximidad temporal muy cercana para toques con muchos dedos. En cuanto a los botones, tendrán una prioridad más alta en la cadena de respuesta, y creo que consumirán sus propios toques sin que la vista de desplazamiento sepa nada. - Matt Wilding

Has estado genial, gracias. Entonces, ¿tiene alguna idea sobre cómo diferenciar entre un toque y un pergamino? - mtmurdock

@mtmurdock: ¿Con el propósito de no descartar el teclado cuando el usuario está intentando desplazarse? - Matt Wilding

Sí, básicamente. De hecho, lo implementé simplemente comprobando si [touches count] == 1 y eso parece funcionar bien. ¡Gracias por tu ayuda! - mtmurdock

También me encontré con el mismo problema. Mientras estaba en IOS 6.0, funcionaba bien, pero tan pronto como cambié a IOS 5.0, comenzó a mostrar el mismo comportamiento que mencionaste.

Entrenamiento para IOS 5.0: debe usar UITapGestureRecognizer. Luego establezca su delegado en uno mismo e implemente el siguiente método de delegado

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch;

as

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ! ([touch.view isKindOfClass:[UIControl class]]);
}
@end

El código anterior verificará que el objeto que se está tocando no es un botón UIB o cualquier elemento de control, luego solo maneje el toque

Espero que solucione tu problema.

respondido 01 mar '13, 12:03

[Enlace] (techotopia.com/index.php/…) aquí hay otra estrategia para manejar lo mismo: ajonnet

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.