Swift - 导航控制器(navigationController)全屏滑动返回功能实现
(本文代码已升级至Swift3)
navigationController(导航控制器)的view自带了滑动手势,只要在屏幕左侧向右拖动页面,就可以滑动返回到前面一个页面。但这个功能仅在屏幕左侧边缘滑动才能触发,我们可以稍作改造,让其支持全屏滑动返回。

1,全屏滑动返回实现原理
(1)系统自带的手势是 UIScreenEdgePanGestureRecognizer 类型对象,看名字就知道这个是屏幕边缘滑动手势。所以系统自带的滑动效果,自然只能实现侧边滑动。
(2)我们自己给导航控制器,添加一个全屏的滑动手势。然后用新添加的滑动手势,来调用系统实现的滑动返回功能(handleNavigationTransition 方法),这样就实现了全屏滑动功能。
(3)注意:我们还要禁止系统自带滑动手势,同时只有非根控制器才有滑动返回功能,根控制器没有。
2,效果图:

3,实现代码:
navigationController(导航控制器)的view自带了滑动手势,只要在屏幕左侧向右拖动页面,就可以滑动返回到前面一个页面。但这个功能仅在屏幕左侧边缘滑动才能触发,我们可以稍作改造,让其支持全屏滑动返回。

1,全屏滑动返回实现原理
(1)系统自带的手势是 UIScreenEdgePanGestureRecognizer 类型对象,看名字就知道这个是屏幕边缘滑动手势。所以系统自带的滑动效果,自然只能实现侧边滑动。
(2)我们自己给导航控制器,添加一个全屏的滑动手势。然后用新添加的滑动手势,来调用系统实现的滑动返回功能(handleNavigationTransition 方法),这样就实现了全屏滑动功能。
(3)注意:我们还要禁止系统自带滑动手势,同时只有非根控制器才有滑动返回功能,根控制器没有。
2,效果图:

3,实现代码:
import UIKit class DetailViewController: UIViewController, UIGestureRecognizerDelegate { override func viewDidLoad() { super.viewDidLoad() let target = self.navigationController?.interactivePopGestureRecognizer!.delegate let pan = UIPanGestureRecognizer(target:target, action:Selector(("handleNavigationTransition:"))) pan.delegate = self self.view.addGestureRecognizer(pan) //同时禁用系统原先的侧滑返回功能 self.navigationController?.interactivePopGestureRecognizer!.isEnabled = false } func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool { if self.childViewControllers.count == 1 { return false } return true } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } }
航哥 谢谢啊 解决了燃眉之急啊
请问一下,我按照你的方法实现之后;我的上一个A视图控制器隐藏了导航栏(需求如此),从B视图控制器滑动返回A视图控制器的时候,从B视图控制器的导航栏也隐藏了,这个问题有办法解决吗?谢谢
rootViewController有冲突,如果在rootViewController里侧滑了 ,页面就不响应点击事件了
航哥,请教个问题,handleNavigationTransition 这个方法名是什么意思呢? 不用手动实现?
手势里面这个 handleNavigationTransition: 方法的实现呢?
我用了怎么出现了 直接帮崩溃了呢
快速垂直滑动,也会触发返回到上一层去
子页面如果有滚动条,好像冲突了
航哥还真是巧了刚好这两天遇到侧滑返回的问题,来的真及时