项目中最近要添加侧滑返回手势,由于项目中包含很多webview的页面,webview页面的手势交互成了难题.在此记录一下解决方法
非webview页面,使用第三方框架FDFullscreenPopGesture
链接戳这里:FDFullscreenPopGesture
webview页面(此处以WKWebview为例,self指代WKWebView所在的viewController)
1.禁用FDFullscreenPopGesture的侧滑返回手势
self.fd_interactivePopDisabled = YES;
2.添加自定义手势
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
// handleNavigationTransition:为系统私有API,即系统自带侧滑手势的回调方法,我们在自己的手势上直接用它的回调方法
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
panGesture.delegate = self; // 设置手势代理,拦截手势触发
[self.view addGestureRecognizer:panGesture];
self.panGesture = panGesture;
// 一定要禁止系统自带的滑动手势
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
3.实现代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
// 当当前控制器是根控制器时,不可以侧滑返回,所以不能使其触发手势
if(self.navigationController.childViewControllers.count == 1)
{
return NO;
}
if ([self.webView canGoBack]) {
CGPoint point = [gestureRecognizer velocityInView:self.webView.scrollView];
NSSLog(@"%@",[NSValue valueWithCGPoint:point]);
// 只有当横向滑动速度大于150时,并且纵向速度绝对值小于150时,才响应手势(可根据需要设置)
if (point.x <= 150 || (point.y >= 150 || point.y <= -150)) {
return NO;
}
[self.webView goBack];
return NO;
}
return YES;
}
//一句话总结就是此方法返回YES时,手势事件会一直往下传递,不论当前层次是否对该事件进行响应。
- (BOOL)gestureRecognizer:(UIPanGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if ([self panBack:gestureRecognizer]) {
return YES;
}
return NO;
}
- (BOOL)panBack:(UIPanGestureRecognizer *)gestureRecognizer {
//是滑动返回距左边的有效长度
int location_X =0.15 * kUISCREENWIDTH;
if (gestureRecognizer == self.panGesture) {
UIPanGestureRecognizer *pan = (UIPanGestureRecognizer *)gestureRecognizer;
CGPoint point = [pan translationInView:self.webView.scrollView];
UIGestureRecognizerState state = gestureRecognizer.state;
if (UIGestureRecognizerStateBegan == state ||UIGestureRecognizerStatePossible == state) {
CGPoint location = [gestureRecognizer locationInView:self.webView.scrollView];
//这是允许每张图片都可实现滑动返回
int temp1 = location.x;
int temp2 = kUISCREENWIDTH;
NSInteger XX = temp1 % temp2;
if (point.x >0 && XX < location_X) {
return YES;
}
}
}
return NO;
}