在 UINavigationController 中将过渡更改为 ONE ViewController,同时保持向后滑动

Change transition to ONE ViewController in a UINavigationController while keeping back-swipe

我想在我的 UINavigationController 中实现到一个特定视图控制器的自定义转换。

我可以通过在里面提供我的自定义 TransitionAnimator 来做到这一点

func navigationController(_ navigationController: UINavigationController, animationControllerFor operation: UINavigationController.Operation, from fromVC: UIViewController, to toVC: UIViewController) -> UIViewControllerAnimatedTransitioning?

or return nil 否则一切正常!所以动画部分已经解决并且可以工作了!

但是在我想要默认过渡的时候 return 设为 nil,我松开了向后滑动的手势。

所以我的问题是: 我如何才能将我的自定义过渡提供给一个特定的 VC,但保持其他一切不变?!?

您可以尝试继承 UINavigationController 并自行管理 interactivePopGestureRecognizer。

class CustomNavController: UINavigationController {
    override func viewDidLoad() {
        super.viewDidLoad()
        interactivePopGestureRecognizer?.delegate = self
    }
}

extension CustomNavController: UIGestureRecognizerDelegate {
    func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
        if gestureRecognizer === interactivePopGestureRecognizer {
            return viewControllers.count > 1
        }
        return true
    }
}

您可以将视图控制器设为导航委托,然后将其重置为 nil。喜欢:

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    navigationController?.interactivePopGestureRecognizer?.delegate = self
}

override func viewDidDisappear(_ animated: Bool) {
    super.viewDidDisappear(animated)
    navigationController?.interactivePopGestureRecognizer?.delegate = nil
}

然后在视图控制器中执行您的自定义动画或制作一个 object/class 来为您处理