我有一个UIWebView加载的html字符串,里面有url链接。如果我点击网址链接,将启动内部自制浏览器以打开该链接。
我在UIWebView中添加了UITapGestureRecognizer
,因此如果用户点击UIWebView上的任何位置,UIWebView将变得更大并打开更完整的html字符串。
我将- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
设置为返回YES,因此UITapGesture可以在UIWebView上正常工作。
但是当我点击UIWebView中的链接时会出现问题。点击链接将调用两个操作:一个是打开浏览器进行链接,另一个是放大UIWebView。
这种冲突不是我想要的。
我希望将两个案例分开,即,如果用户单击UIWebView上的链接,则浏览器将为该链接打开;如果用户点击没有url链接的UIWebView,则会放大UIWebView。
如何通过使两个动作共存但没有冲突来解决这个问题?
由于
答案 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
。