iOS开发实践

iOS开发-WKWebView或者UIScrollView添加侧

2018-07-20  本文已影响1562人  来者可追文过饰非

项目中最近要添加侧滑返回手势,由于项目中包含很多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;
}
上一篇 下一篇

猜你喜欢

热点阅读