问题描述
示意图.gif假设我们的 App
在首页带有侧边栏的抽屉滑动效果。那么这时会有一个问题:
如果右侧的页面,是一个通过
UINavigationViewController
,你的侧滑返回手势,和侧滑拉出抽屉的手势冲突了。你会发现,抽屉根本拉不出来
解决思路
手势冲突了,那么我希望什么呢?
我希望在Navigation
的viewControllers
的栈顶控制器(就是一级页面),禁用 NavigationController
的侧滑返回手势,而在二级会以上的页面才恢复。
实质就是,需要写一个导航控制器的子类,在其中接管侧滑返回的代理控制侧滑手势的使能。
代码
class WithoudGestureRecognitionOnTopNavigationViewController: UINavigationController, UIGestureRecognizerDelegate, UINavigationControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
interactivePopGestureRecognizer?.delegate = self
delegate = self
}
// MARK: UINavigationControllerDelegate
// 导航的栈顶页面,增加手势禁用,防止拉开抽屉和侧滑返回的手势冲突
func navigationController(_ navigationController: UINavigationController, didShow viewController: UIViewController, animated: Bool) {
// 只有一个根控制器的时候,禁用手势
interactivePopGestureRecognizer?.isEnabled = viewControllers.count > 1
}
}
网友评论