iphone - TapGesture en UIWebView entra en conflicto con el enlace al hacer clic

Tengo una cadena HTML cargada UIWebView con enlaces URL dentro. si hago clic en los enlaces de la URL, se iniciará un navegador interno para abrir ese enlace.

Agregué un UITapGestureRecognizer a UIWebView, por lo que si el usuario toca en cualquier parte de UIWebView, UIWebView se agrandará y abrirá una cadena html más completa.

Configuro el - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizerpara devolver SÍ, por lo que UITapGesture funciona en UIWebView sin problema.

pero ocurre un problema cuando hago clic en un enlace dentro de UIWebView. al hacer clic en un enlace se invocarán dos operaciones: una es abrir el navegador para el enlace y la otra es ampliar UIWebView.

Este conflicto no es lo que quiero.

Quiero dos casos separados, es decir, si un usuario hace clic en un enlace en UIWebView, el navegador se abrirá para ese enlace; si un usuario toca en UIWebView donde no existen enlaces de URL, UIWebView se agranda.

¿Cómo puedo resolver eso haciendo que dos acciones coexistan pero no estén en conflicto?

Muchas Gracias

preguntado el 27 de agosto de 11 a las 18:08

¿Descubriste cómo hacer esto al final? -

2 Respuestas

Sé que esta pregunta es antigua, pero pasé algunas horas en Google y Stack Overflow, y pensé que podría ayudar a alguien que se encuentre con esta pregunta en el futuro. Con suerte, esta es la forma correcta de resolver este problema.

Resolví este problema escribiendo código JavaScript para determinar si se hizo clic en un enlace. Mi solución se basó en esta respuesta en Stack Overflow. Hay una función de JavaScript que obtiene la lista de todos los enlaces en UIWebView y sus límites usando getBoundingClientRect (). Luego, la función CGRectContainsPoint () nos dice si el objeto UITouch dado está dentro de los enlaces que delimitan los rectángulos.

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

    BOOL retVal = YES;

    //Check if a link was clicked
    NSString *js = @"function f(){ var a = document.getElementsByTagName('a'); var retVal = new Array(); for (var idx= 0; idx < a.length; ++idx){ var r = a[idx].getBoundingClientRect(); retVal[idx] = '{{'+r.left+','+r.top+'},{'+r.width+','+r.height+'}}'; } return retVal.join(';'); } f();";
    NSString *result = [self.webView stringByEvaluatingJavaScriptFromString:js];

    NSArray *linkArray = [result componentsSeparatedByString:@";"];
    CGPoint touchPoint = [touch locationInView:self.webView];
    for ( NSString *linkRectStr in linkArray ) {
        CGRect rect = CGRectFromString(linkRectStr);
        if ( CGRectContainsPoint( rect, touchPoint ) ) {
            NSLog(@"Link Clicked");
            retVal = NO;
            break;
        }
    }

    return retVal;
}

Es de esperar que usar JavaScript de esta manera no cause demasiado impacto en el rendimiento. Especialmente cuando hay que volver a calcularlo en cada toque.

contestado el 23 de mayo de 17 a las 13:05

Gracias - ¡útil casi 3 años después de que lo publicó y 4.5 años después de que se hizo la pregunta! - ChrisH

en algún momento tengo r.width = 0. ¿Tenías alguna idea? - Nam Vu

Puede implementar su UIWebViewdel delegado -webView:shouldStartLoadWithRequest:navigationType método. Regresar NO cuando no desea que se abra el enlace.

Respondido 27 ago 11, 22:08

Perdón mi error. Debería haber dicho claramente que quiero que se abra el enlace y que el tapgesture funcione si el usuario no hace clic en el enlace. - Jackson Tale

Si el usuario no se haga clic en el enlace? - Chaitanya Gupta

si el usuario no hace clic en el enlace (lo que significa que el usuario hace clic / toca en UIWebView donde no existen enlaces, como texto puro), entonces el tapgesture funciona y uiwebview agrandado - Jackson Tale

Está bien. No estoy muy seguro de cómo lo haría. - Chaitanya Gupta

@ChaitanyaGupta, ¿al final descubriste cómo hacer esto? - aherlambang

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