在自定义返回按钮时在隐藏导航栏后我们会遇到右滑返回手势失效的情况,针对这种情况解决方法如下:
- 什么时候会被拦截
当我们使用代码或者用storyboard来创建一个新的控制器的时候,我们很少注意导航栏的leftItem,因为正常情况下push到下一个界面的leftItem就是上一个界面的self.title,并且它也就是一个返回的功能,所以,我们很少去在意这些~但当我们有些需求,需要自定义leftItem的时候,那么问题就来了:
- 问题一:怎么自定义leftItem
- 问题二:为什么系统自带的右滑返回手势失效
- 问题三:怎么解决这个失效问题
1.怎么自定义leftItem
//自定义一个返回按钮
UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom]; [leftBtn setTitle:@"返回" forState:UIControlStateNormal];
[leftBtn addTarget:self action:@selector(backLastView) forControlEvents:UIControlEventTouchUpInside];
leftBtn.frame = CGRectMake(0, 0, 60, 40); [leftBtn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
//将leftItem设置为自定义按钮
UIBarButtonItem *leftItem =[[UIBarButtonItem alloc]initWithCustomView: leftBtn];
self.navigationItem.leftBarButtonItem = leftItem;
按钮点击事件 返回上一个界面
- (void)backLastView {
[self.navigationController popViewControllerAnimated:YES];
}
需要注意的是:xcode自动从6.0之后leftItem距左屏幕边距有16个像素点,这样会导致在视觉上会感觉有点偏右、不美观,对于大多数程序员来说这明显是不能让人去接受的,解决办法 :
设置一下按钮的**contentEdgeInsets**(文字)**imageEdgeInsets**(图片)属性即可,如:
leftButton.contentEdgeInsets = UIEdgeInsetsMake(0, -16, 0, 0);
2.怎么解决这个失效问题
- 其实很简单很简单~只需要添加下面这一句代码即可
self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
其实到这里,问题应该都解决了,但是,毕竟右滑返回手势只能靠近屏幕左边缘才能使用,我们如何通过调用系统方法来实现在整个屏幕右滑就可以实现返回功能呢,
- 1:需要获取系统自带滑动手势的target对象
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
- 2:创建全屏滑动手势~调用系统自带滑动手势的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
- 3:设置手势代理~拦截手势触发
pan.delegate = self;
- 4:别忘了~给导航控制器的view添加全屏滑动手势
[self.view addGestureRecognizer:pan];
- 5:将系统自带的滑动手势禁用
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
-
6:还记得刚刚设置的代理吗?下面方法什么时候调用?在每次触发手势之前都会询问下代理,是否触发。
这个方法就是拦截手势触发的方法.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
return NO; //则不需要触发滑动手势
return YES; //则需要触发滑动手势
}