iOS开发-WKWebView或者UIScrollView添加侧滑返回手势

项目中最近要添加侧滑返回手势,由于项目中包含很多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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,213评论 3 119
  • 李继芬:北京清华大学附属二院原肿瘤科主任,从事医疗临床4O余年,有丰富的中医中药治疗肿瘤的经验,在中西医...
    勇敢战士阅读 267评论 0 0
  • 文/陌宇轩 (黑龙江) 这世界太冷 隔着岁月 仍会把笑容冻凉
    小哲小诗阅读 153评论 0 0
  • 为了让我有一个更快速、更精彩、更辉煌的成长,我将开始这段刻骨铭心的自我蜕变之旅!从今天开始,我将每天坚持阅读一...
    李薇帆阅读 644评论 1 2
  • 生日快乐宝宝
    暖暖暖不暖阅读 368评论 0 0

友情链接更多精彩内容