iphone - UIWebView上的TapGesture与链接点击冲突

Jac*_*ale 7 iphone url uiwebview uigesturerecognizer uitapgesturerecognizer

我有一个UIWebView加载的html字符串,里面有url链接.如果我点击网址链接,将启动内部自制浏览器以打开该链接.

UITapGestureRecognizer在UIWebView中添加了一个,因此如果用户点击UIWebView上的任何位置,UIWebView将变得更大并打开更完整的html字符串.

我将其设置- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer为返回YES,因此UITapGesture可以在UIWebView上正常工作.

但是当我点击UIWebView中的链接时会出现问题.单击链接将调用两个操作:一个是打开浏览器进行链接,另一个是放大UIWebView.

这种冲突不是我想要的.

我希望将两个案例分开,即,如果用户单击UIWebView上的链接,则浏览器将打开该链接; 如果用户点击没有url链接的UIWebView,则会放大UIWebView.

如何通过使两个动作共存但没有冲突来解决这个问题?

谢谢

小智 8

我知道这个问题已经过时了,但我花了几个小时在Google和Stack Overflow上,我认为它可能有助于将来遇到这个问题的人.希望这是解决这个问题的正确方法.

我通过编写一些JavaScript代码来确定链接是否被点击,从而解决了这个问题.我的解决方案基于Stack Overflow上的这个答案.有一个JavaScript函数可以使用getBoundingClientRect()获取UIWebView中所有链接的列表及其边界.然后函数CGRectContainsPoint()告诉我们给定的UITouch对象是否在链接边界内.

- (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;
}
Run Code Online (Sandbox Code Playgroud)

希望以这种方式使用JavaScript不会导致太多的性能损失.特别是当每次敲击必须重新计算时.