7

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

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

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

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

这种矛盾不是我想要的。

我想将两种情况分开,即,如果用户单击 UIWebView 上的链接,则浏览器将为该链接打开;如果用户点击不存在 url 链接的 UIWebView,则 UIWebView 会被放大。

我怎样才能通过使两个动作共存但不冲突来解决这个问题?

谢谢

4

2 回答 2

9

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

我通过编写一些 JavaScript 代码来确定是否单击了链接,从而解决了这个问题。我的解决方案是基于Stack Overflow 上的这个答案。有一个 JavaScript 函数可以获取 UIWebView 中所有链接的列表,以及使用 getBoundingClientRect() 的边界。然后函数 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 不会对性能造成太大影响。尤其是当每次点击都必须重新计算时。

于 2013-04-13T04:23:19.210 回答
0

您可以实现您UIWebView的委托-webView:shouldStartLoadWithRequest:navigationType方法。NO当您不想打开链接时返回。

于 2011-08-27T18:29:30.190 回答