ios7之后,导航控制器自带滑动返回功能,且是边缘侧滑返回功能.
使用UINavigationController进行控制器跳转的时候,
如果我们修改了系统自带的返回按钮,导致滑动返回功能失效.
那么我们想要使用自定义按钮,又想使用导航控制器的滑动返回功能
这个Bug如何解决?
当我们使用自定义按钮的时候,按钮将系统自带的返回按钮遮挡,此时才导致侧滑返回失效. 为什么滑动返回功能失效?
分析:当我们没有使用自定义按钮时,系统默认侧滑返回的实现,这里的消息传递由代理实现.所以是代理让滑动功能失效
验证:
滑动返回肯定需要一个手势,那么在头文件中查找,找到interactivePopGestureRecognizer 翻译过来是返回交互手势,那么可以肯定苹果底层对这个手势进行了某些操作.
通过打印interactivePopGestureRecognizer 以及 它的代理,打印结果如下:
此时可以确定,底层对这个手势进行了操作.
那么,我们想要我们自定义的按钮对滑动手势进行响应时,将代理赋值为nil,不需要它来监听手势,按照默认响应滑动事件.
此时滑动返回功能完全实现,但是存在一个Bug:应用程序会出现假死状态.
策略:将手势代理设置为自己,实现响应事件
self.interactivePopGestureRecognizer.delegate = self;
注意:这个滑动返回功能是边缘侧滑返回!!!!!也就是说在view中间或者其他地方滑动是不能实现界面返回的!!!!
实现全屏滑动返回代码如下:
①干掉系统边缘侧滑手势:
self.interactivePopGestureRecognizer.enabled = NO;
②创建滑动返回手势:
注意: 该方法中第一个参数是:系统调用的对象,因为打印结果_UINavigationInteractiveTransition是私有的类,我们无法拿到,但是代理对象和它属于同一个类,我们可以通过代理代理来代替这个对象,拿到它的方法.
第二个参数action:就是系统滑动返回的方法,直接拿来用就可以
③将手势添加到当前view 并设置手势代理,
④代理方法实现
此代理方法是在UITabBarController UINavigationController一起使用的时候用作的判断(根控制器不需要滑动返回功能).