Jac*_*ale 7 iphone url uiwebview uigesturerecognizer uitapgesturerecognizer
我有一个UIWebView加载的html字符串,里面有url链接.如果我点击网址链接,将启动内部自制浏览器以打开该链接.
我UITapGestureRecognizer在UIWebView中添加了一个,因此如果用户点击UIWebView上的任何位置,UIWebView将变得更大并打开更完整的html字符串.
我将其设置- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer为返回YES,因此UITapGesture可以在UIWebView上正常工作.
但是当我点击UIWebView中的链接时会出现问题.单击链接将调用两个操作:一个是打开浏览器进行链接,另一个是放大UIWebView.
这种冲突不是我想要的.
我希望将两个案例分开,即,如果用户单击UIWebView上的链接,则浏览器将打开该链接; 如果用户点击没有url链接的UIWebView,则会放大UIWebView.
如何通过使两个动作共存但没有冲突来解决这个问题?
谢谢
小智 8
我知道这个问题已经过时了,但我花了几个小时在Google和Stack Overflow上,我认为它可能有助于将来遇到这个问题的人.希望这是解决这个问题的正确方法.
我通过编写一些JavaScript代码来确定链接是否被点击,从而解决了这个问题.我的解决方案基于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;
}
Run Code Online (Sandbox Code Playgroud)
希望以这种方式使用JavaScript不会导致太多的性能损失.特别是当每次敲击必须重新计算时.
| 归档时间: |
|
| 查看次数: |
1522 次 |
| 最近记录: |