Estoy mostrando un documento en un UIWebView. Quiero colocar un punto de acceso público sobre el documento para activar una acción cuando se toca, pero también quiero mantener el comportamiento predeterminado de UIWebView de autoenfocar el documento cuando se toca dos veces. No puedo entender cómo responder a los golpes individuales mientras dejo que UIWebView responda a los doble golpecitos.¿Cómo responder solo a un gesto de un solo toque mientras se dejan que los objetos respondan a doble toque?
Primero configuré el punto de acceso como un UIButton transparente con una acción, pero al tocar dos veces el punto de acceso público se activó dos veces la acción del punto de acceso. Así que me quité la acción desde el botón y adjuntado un gesto de un solo toque en su lugar:
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
Esto funciona igual que el botón de acción normal. Pero luego he creado un gesto doble toque, y configurado para bloquear el gesto de un solo toque con requireGestureRecognizerToFail:
UITapGestureRecognizer *doubleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(zoomWebView:)];
doubleTap.numberOfTapsRequired = 2;
doubleTap.delegate = self;
[self.hotspot addGestureRecognizer:doubleTap];
[doubleTap release];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapAction:)];
singleTap.numberOfTapsRequired = 1;
[singleTap requireGestureRecognizerToFail:doubleTap];
singleTap.delegate = self;
[self.hotspot addGestureRecognizer:singleTap];
[singleTap release];
- (void)zoomWebView:(UITapGestureRecognizer *)gesture {
NSLog(@"double tap");
}
Con esta configuración, un solo toque en el punto de acceso llama singleTapAction y un doble toque en el el punto de acceso llama a zoomWebView (un método personalizado). Esto es bueno porque singleTapAction ya no se llama dos veces, pero es malo porque UIWebView ya no responde al doble toque.
Intenté reenviar el evento de doble toque desde mi gesto doubleTap a UIWebView mediante la subclase de UITapGestureRecognizer, anulando los métodos touchesBegan y touchesEnded, y enviando sus argumentos a los métodos correspondientes de UIWebView. Cuando lo hice, pude ver que mi subclase recibía los eventos, pero UIWebView no respondió a los eventos reenviados. Esto es de esperar porque Event Handling Guide for iOS dice que solo podemos reenviar eventos a subclases personalizadas de UIView, no a objetos de marco UIKit.
¿Hay alguna manera de evitar que mi gesto de un solo toque responda a doble toque que no desvía los eventos de doble toque? Esto parece un requisito básico, pero no puedo ver una forma directa de hacerlo. Leí y experimenté con el touch delivery properties de UIGestureRecognizer, pero ninguna combinación de valores detuvo el gesto de un solo toque de consumir el gesto de doble toque.
Por cierto, la relación entre el punto de acceso y la UIWebView en mi jerarquía de vistas es la de "primos", son subvistas de dos vistas de hermanos. Si agrego los reconocedores de gestos a la vista de zona activa, la vista web o su vista "abuelo", obtengo los mismos resultados.
no está seguro acerca de esto (de ahí que sea un comentario), pero no se puede añadir un solo gesto grifo para UIWebView? –
@DeanPucsek. Estuve haciendo eso por un tiempo y funcionó al mostrar documentos PDF. Pero si el contenido que se muestra en UIWebView es HTML o JPG, UIWebView captura el solo toque para sus propias acciones y UIGestureRecognizer no recibe el evento. Sería más conveniente manejar esto con una vista de punto de acceso, pero podría volver a este enfoque si pudiera hacerlo funcionar con todos los tipos de contenido de UIWebView. – arlomedia