- 当我们自定义了导航栏的返回按钮的时候由于我们自定义的按钮覆盖了原有的按钮。会导致我们的左滑返回功能丧失,我们有一种方法可以解决这个问题.就是把导航控制器的手势代理清空。就会还原滑动返回功能,代码如下
- (void)viewDidLoad
{
// 清空滑动返回手势代理
self.interactivePopGestureRecognizer.delegate = nil;
}
- 但是,假如你真的这么做了,也只是解了燃煤之急而已,更大的bug出现了。当你滑动返回到根控制器再根控制器左侧滑动返回的时候程序,你再点击push按钮跳转的时候会直接挂掉。(push按钮直接灰,界面无响应)如图:
- 出现这个bug的原因是当我们清空完手势代理的时候,当我们push控制器的时候我们的内部代理可能需要做一些事情,然后这个时候代理我们已经被清空,自然而然就崩了。于是就有了这种解决思路,我们可以让代理监听控制器的push完成,假如push完成之后的控制器是根控制器我们就让他的手势代理完成,具体实现代码如下
@interface ZSNavigationController ()<UINavigationControllerDelegate>
/** 记录手势代理 */
@property(nonatomic,strong)id gestureDelegate;
-(void)viewDidLoad
{
self.delegate = self;
// 保存手势代理
self.gestureDelegate = self.interactivePopGestureRecognizer.delegate;
}
-(void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// push完成时在非根控制器下清空代理,根控制器下还原
self.interactivePopGestureRecognizer.delegate = viewController == self.childViewControllers[0] ? _gestureDelegate : 0;
}
@end
- 基本上的功能已经实现了,可是自带的这个左滑的范围非常小,如果我们想要手势响应范围更大的话需要自己手动创建一个新的手势,具体怎么实现呢?请看下部分