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

时间:2011-08-27 18:04:38

标签: iphone url uiwebview uigesturerecognizer uitapgesturerecognizer

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

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

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

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

这种冲突不是我想要的。

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

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

由于

2 个答案:

答案 0 :(得分:8)

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

我通过编写一些JavaScript代码来确定链接是否被点击,从而解决了这个问题。我的解决方案基于this answer on 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;
}

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

答案 1 :(得分:0)

您可以实施UIWebView代理人的-webView:shouldStartLoadWithRequest:navigationType方法。当您不希望链接打开时,请返回NO