UINavigationController自定义animation可以防止从工作中滑动回去

我注意到一些奇怪的东西,可能是UINavigationController中的一个bug。 当你重写-navigationController:animationControllerForOperation:fromViewController:toViewController:

并返回nil(对于默认的animation行为),拖回手势不再起作用。 这个方法的文档说你应该返回“无,如果你想使用标准的导航控制器转换”。 我读到这个是返回零不应该防止默认行为发生。

我还发现,如果导航控制器的interactivePopGestureRecognizer.delegate中的某个对gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:返回YES, gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: Pop手势再次起作用。 然而,这个解决方法是有风险的,因为我们正在跺脚安装的默认代理,这是一个_UINavigationInteractiveTransition。

有没有我可以重写animationController方法,同时保留默认的拖动到回去的手势?

这个问题是相关的。

这个SO问题是关于相同的主题,这个答案可能会解决这个问题:

https://stackoverflow.com/a/20923477/145710

如果你已经子类UINavigationController,最简单的修正如下(iOS 9.3,Swift 2.2):

 override func viewDidLoad() { super.viewDidLoad() interactivePopGestureRecognizer?.delegate = nil } 

或者,在UIViewController的任何其他实例中:

 override func viewDidLoad() { super.viewDidLoad() navigationController?.interactivePopGestureRecognizer?.delegate = nil } 

实现委托方法navigationController(_:animationControllerFor:from:to:)会禁用导航控制器的交互式popup手势识别器,但将手势的代理设置为零将重新启用它。

如果您只想在特定情况下启用手势,请参阅此答案 。