iOS如何支持手势返回

传统做法是在viewcontroller上设置navigationController的interactivePopGesturerecovnezer,但是bug很多,推荐如下,在nav controller上的做法:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
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
}
}
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 } }
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 项目。

Leave a Reply

Your email address will not be published. Required fields are marked *