Por lo que he visto, UIWebView no funciona bien con los demás. Para reconocedores gesto, podría intentar volver SÍ a partir de:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
que tenía que ser compatible con 3.0 por lo que terminaron haciendo todo el manejo con Javascript dentro del UIWebView gesto. No es una buena solución, pero funcionó para mis necesidades. Pude capturar una pulsación larga en un elemento, así como tocar, deslizar, pellizcar y rotar. Por supuesto, estaba usando solo contenido local.
Editar:
Usted puede mirar en PhoneGap para un ejemplo de envío de mensajes a la delegada del UIWebView. En pocas palabras, se utiliza document.location = "myscheme:mycommand?myarguments"
continuación, analizar el comando y los argumentos de esta devolución de llamada delegado:
-(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType {
if ([[[inRequest URL] absoluteString] hasPrefix:@"myscheme:"]) {
//.. parse arguments
return NO;
}
}
Se puede ver en el código PhoneGap que configurar una cola y un temporizador para enviar los mensajes. Dependiendo de su uso, es posible que deba hacer lo mismo. Hay otras preguntas sobre SO sobre este tema.
Aquí está la documentación Event Handling. En mi caso he añadido a los detectores de eventos document
de <body onload="myloader();">
function myloader() {
document.addEventListener('touchcancel' , touch_cancel , false);
document.addEventListener('touchstart' , touch_start , false);
document.addEventListener('touchmove' , touch_move , false);
document.addEventListener('touchend' , touch_end , false);
};
El manejo de eventos real depende en gran medida de sus necesidades. Cada controlador de eventos recibirá un TouchEvent con una propiedad de toques donde cada elemento es Touch. Puede registrar la hora y la ubicación de inicio en su controlador Touchstart. Si los toques se mueven demasiado o pasa la cantidad de tiempo incorrecta, no es un toque prolongado.
WebKit puede tratar de manejar un toque largo para comenzar una selección y copia. En su controlador de eventos puede usar event.preventDefault();
para detener el comportamiento predeterminado. También encontré la propiedad de css -webkit-user-select:none
a mano para algunas cosas.
var touch = {};
function touch_start(event /*TouchEvent*/ {
event.preventDefault();
touch = {};
touch.startX = event.touches.item(0).pageX;
touch.startY = event.touches.item(0).pageY;
touch.startT = (new Date()).getTime();
}
Este es solo el segundo proyecto con el que he usado javascript. Puedes encontrar mejores ejemplos en otros lugares.
Como puede ver, esta no es una respuesta rápida a su problema. Estoy muy contento con los resultados que obtuve. El html con el que estaba trabajando no tenía elementos interactivos más allá de uno o dos enlaces.
Gracias, no sé nada de Javascript; ¿Sería tan amable de señalarme en la dirección correcta sobre cómo detectar un toque en un UIWebView a través de Javascript y llamar a un método Objective-C? No me importaría ser compatible con 3.0 para la orientación no iPad. Para cualquier otro que solo se preocupe por 3.2+, solucioné mi problema simplemente creando una vista transparente justo encima de UIWebView y detectando los toques en el mismo. Gracias – rscott
dat trabajó – user578386
Gracias, funciona bien –