UINavigationController全屏滑动返回
//注销系统方法
self.interactivePopGestureRecognizer.enabled = NO;
// 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
// 设置手势代理,拦截手势触发
// 声明UIGestureRecognizerDelegate 代理
pan.delegate = self;
// 给导航控制器的view添加全屏滑动手势
[self.view addGestureRecognizer:pan];
// 什么时候调用:每次触发手势之前都会询问下代理,是否触发。
// 作用:拦截手势触发
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 注意:只有非根控制器才有滑动返回功能,根控制器没有。
// 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
if (self.childViewControllers.count == 1) {
// 表示用户在根控制器界面,就不需要触发滑动手势,
return NO;
}
return YES;
}
UINavigationController左边缘滑动返回
// 为了获取保存系统的 代理
@property (nonatomic ,assign) id target;
// 获取系统自带滑动手势的target对象
self.target = self.interactivePopGestureRecognizer.delegate;
// 实现UINavigationControllerDelegate的代理和声明
self.delegate = self;
//UINavigationControllerDelegate 代理方法
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == [self.viewControllers firstObject] )
{
self.interactivePopGestureRecognizer.delegate = self.target;
}
}
-(void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (self.childViewControllers.count>0)
{
// 设置导航条左边按钮的内容,把系统的返回按钮给覆盖,导航控制器的滑动返回功能就消失了
//覆盖后如果不把系统滑动返回功能注销 或自己重新实现 在首界面左边缘滑动会崩溃
// 注销方法self.interactivePopGestureRecognizer.delegate = nil;
UIButton *button = [[UIButton alloc] init];
[button setImage:[UIImage imageNamed:@"返回"] forState:UIControlStateNormal];
[button addTarget:self action:@selector(backButtonClick) forControlEvents:UIControlEventTouchUpInside];
button.size = button.currentImage.size;
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:button];
self.navigationBarHidden=NO;
self.interactivePopGestureRecognizer.delegate = nil;
viewController.automaticallyAdjustsScrollViewInsets=NO;
}
[super pushViewController:viewController animated:animated];
}
-(void)backButtonClick
{
[self popViewControllerAnimated:YES];
}