杂⑦碎八之--导航控制器滑动返回功能

ios7之后,导航控制器自带滑动返回功能,且是边缘侧滑返回功能.

使用UINavigationController进行控制器跳转的时候,

如果我们修改了系统自带的返回按钮,导致滑动返回功能失效.

那么我们想要使用自定义按钮,又想使用导航控制器的滑动返回功能

这个Bug如何解决?

当我们使用自定义按钮的时候,按钮将系统自带的返回按钮遮挡,此时才导致侧滑返回失效. 为什么滑动返回功能失效? 

分析:当我们没有使用自定义按钮时,系统默认侧滑返回的实现,这里的消息传递由代理实现.所以是代理让滑动功能失效

验证:

滑动返回肯定需要一个手势,那么在头文件中查找,找到interactivePopGestureRecognizer  翻译过来是返回交互手势,那么可以肯定苹果底层对这个手势进行了某些操作.

通过打印interactivePopGestureRecognizer 以及 它的代理,打印结果如下:

杂⑦碎八之--导航控制器滑动返回功能_第1张图片

此时可以确定,底层对这个手势进行了操作.

那么,我们想要我们自定义的按钮对滑动手势进行响应时,将代理赋值为nil,不需要它来监听手势,按照默认响应滑动事件.

此时滑动返回功能完全实现,但是存在一个Bug:应用程序会出现假死状态.

策略:将手势代理设置为自己,实现响应事件

self.interactivePopGestureRecognizer.delegate = self;


注意:这个滑动返回功能是边缘侧滑返回!!!!!也就是说在view中间或者其他地方滑动是不能实现界面返回的!!!!

实现全屏滑动返回代码如下:

①干掉系统边缘侧滑手势:

self.interactivePopGestureRecognizer.enabled = NO;

②创建滑动返回手势:

注意: 该方法中第一个参数是:系统调用的对象,因为打印结果_UINavigationInteractiveTransition是私有的类,我们无法拿到,但是代理对象和它属于同一个类,我们可以通过代理代理来代替这个对象,拿到它的方法.

第二个参数action:就是系统滑动返回的方法,直接拿来用就可以

③将手势添加到当前view  并设置手势代理,

④代理方法实现


此代理方法是在UITabBarController  UINavigationController一起使用的时候用作的判断(根控制器不需要滑动返回功能).

你可能感兴趣的:(杂⑦碎八之--导航控制器滑动返回功能)