美文网首页
iOS Scrollview和系统滑动返回冲突

iOS Scrollview和系统滑动返回冲突

作者: d4d5907268a9 | 来源:发表于2023-06-06 14:46 被阅读0次

方案1

// 继承uinavigationcontroller,并获取到滑动返回手势

class NavigationController: UINavigationController {
    /// 获取屏幕边缘侧滑手势
    @objc func getScreenEdgePanGestureRecognizer() -> UIScreenEdgePanGestureRecognizer? {
        var edgePan: UIScreenEdgePanGestureRecognizer?
        if let recognizers = view.gestureRecognizers, recognizers.count > 0 {
            for recognizer in recognizers {
                if recognizer is UIScreenEdgePanGestureRecognizer {
                    edgePan = recognizer as? UIScreenEdgePanGestureRecognizer
                    break
                }
            }
        }
        return edgePan
    }
}

在冲突的那个scrollview上添加手势关系

for (UIView *view in self.view.subviews) {
        if ([view isKindOfClass:[UIScrollView class]]){
            if ([self.navigationController isKindOfClass:[NavigationController class]]){
                NavigationController *nav = (NavigationController *)self.navigationController;
                UIGestureRecognizer *screenGes = [nav getScreenEdgePanGestureRecognizer];
                UIScrollView *sc = (UIScrollView *)view;
                [sc.panGestureRecognizer requireGestureRecognizerToFail:screenGes];
            }
            NSLog(@"");
            break;
        }
    }

方案2

在有冲突的那个页面实现滑动返回手势的代理

self.navigationController?.interactivePopGestureRecognizer?.delegate = self

在手势代理中判断是否需要触发当前的滑动返回手势

extension MyController : UIGestureRecognizerDelegate {
    
    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        //  gestureRecognizer 即为当前的系统滑动返回手势
        //  otherGestureRecognizer也可能是其他的滑动返回手势,如wkwebview的H5页面后退,如果是则优先触发otherGestureRecognizer
        if gestureRecognizer.isKind(of: UIScreenEdgePanGestureRecognizer.self) && false == otherGestureRecognizer.isKind(of: UIScreenEdgePanGestureRecognizer.self) {
            otherGestureRecognizer.require(toFail: gestureRecognizer)
            print("其他手势:\(otherGestureRecognizer)")
            return false
        }
        return true
    }
}

相关文章

网友评论

      本文标题:iOS Scrollview和系统滑动返回冲突

      本文链接:https://www.haomeiwen.com/subject/qbsgedtx.html