iphone - 点击 WebView 上的手势与点击的链接冲突

Posted

技术标签:

【中文标题】iphone - 点击 WebView 上的手势与点击的链接冲突【英文标题】:iphone - TapGesture on UIWebView conflicts with the link clicking 【发布时间】:2011-08-27 18:04:38 【问题描述】:

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

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

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

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

这种冲突不是我想要的。

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

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

谢谢

【问题讨论】:

你最后想好怎么做了吗? 【参考方案1】:

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

我通过编写一些 javascript 代码来确定是否点击了链接,从而解决了这个问题。我的解决方案是基于this answer on 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 不会对性能造成太大影响。尤其是当每次点击都必须重新计算时。

【讨论】:

谢谢 - 在您发布后近 3 年和提出问题后 4.5 年有用! 有时我的 r.width = 0。你知道吗?【参考方案2】:

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

【讨论】:

对不起,我的错误。我应该清楚地说,如果用户不点击链接,我希望链接打开并希望 Tapgesture 工作。 如果用户没有点击链接? 如果用户没有点击链接(这意味着用户在没有链接的 UIWebView 上点击/点击,例如纯文本),则点击手势有效并且 uiwebview 放大 好的。我不太确定你会怎么做。 @ChaitanyaGupta 你知道到底该怎么做吗?

以上是关于iphone - 点击 WebView 上的手势与点击的链接冲突的主要内容,如果未能解决你的问题,请参考以下文章

重叠视图和手势识别器 iPhone

iOS 如何在滚动视图/webview 上实现点击手势以“敲出”文本字段?

iphone - 单击手势与双一发生冲突

处理带有参数 iphone / ipad 的点击手势

在 iPhone 上的同一 HTML 元素上滑动和平移手势

根据 iPhone 上的内容设置 webview 的动态高度