传统做法是在viewcontroller上设置navigationController的interactivePopGesturerecovnezer,但是bug很多,推荐如下,在nav controller上的做法:
class C4MVTNavigationController: UINavigationController { // MARK: - Property override var supportedInterfaceOrientations: UIInterfaceOrientationMask { return self.visibleViewController?.supportedInterfaceOrientations ?? .portrait } override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { return self.visibleViewController?.preferredInterfaceOrientationForPresentation ?? .portrait } // MARK: - Funtions override func viewDidLoad() { super.viewDidLoad() delegate = self } } extension C4MVTNavigationController: UINavigationControllerDelegate { func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) { let isRoot = ( viewController == navigationController.viewControllers.first ) var enable = !isRoot if enable { if let vc = viewController as? C4MVTBaseController { enable = vc.needPopGesture } } if enable { navigationController.interactivePopGestureRecognizer?.isEnabled = !isRoot navigationController.interactivePopGestureRecognizer?.delegate = self } else { navigationController.interactivePopGestureRecognizer?.isEnabled = false navigationController.interactivePopGestureRecognizer?.delegate = nil } } } extension C4MVTNavigationController: UIGestureRecognizerDelegate { func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { return true } }
完整代码可以参考我的 iOSMVT 项目。