序言及问题:因为业务逻辑是需要在点击webView中HTML页面元素时获取到元素信息做进一步的处理,我用下面简单的代码去添加手势获取。
- (void)viewDidLoad {
[super viewDidLoad];
_webView = [[WKWebView alloc]init];
_webView.frame = self.view.frame;
_webView.center = self.view.center;
[self.view addSubview:_webView];
[_webView setUIDelegate:self];
[_webView setNavigationDelegate:self];
tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(webViewClick:)];
[self.view addGestureRecognizer:tap];
[_webView loadRequest:[NSURLRequest requestWithURL:_url]];
}
然并卵,webView对手势没有任何反应。
解决过程:很快我就知道肯定是webView相比UIView来说的特殊之处,是不响应手势?手势冲突?
经分析,原来webView都有一个属性是scrollView。
@property (nonatomic, readonly, strong) UIScrollView *scrollView;
scrollView中定义了很多处理手势的方法,所以跟webView中scrollView处理手势的方法冲突了。
解决方法:
直接上代码并解释:
在定义tap的代码后面增加tap.delegate = self声明。并实现代理方法:
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
这个协议是在处理手势时,本手势是否和其他手势同时被识别,返回YES就是可以被同时识别的意思。
PS: 这个代理方法如果返回NO,可以保证不同时识别别的手势;但是返回YES不能保证一定可以同时识别到别手势,因为别的手势的代理处理方法可能是返回NO的。