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 上的手势与点击的链接冲突的主要内容,如果未能解决你的问题,请参考以下文章