右滑返回手势 效果
- 实现:需要自定义导航控制器,JPNavigationController
思路分析:
- 右滑返回手势的代理设置给导航控制器,每当用户触发右滑返回手势就会调用
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer;
实现
- 1.设置代理
@interface JPNavigationController () <UIGestureRecognizerDelegate>
@implementationJPNavigationController
- (void)viewDidLoad {
[super viewDidLoad];
// 设置代理
self.interactivePopGestureRecognizer.delegate = self;
}
@end
- 2.实现代理方法
#pragma mark - <UIGestureRecognizerDelegate>
/**
* 每当用户触发[返回手势]时都会调用一次这个方法
* 返回值:返回YES,手势有效; 返回NO,手势失效
*/
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 如果当前显示的是第一个子控制器,就应该禁止掉[返回手势]
// if (self.childViewControllers.count == 1) return NO;
// return YES;
return self.childViewControllers.count > 1; // 处理后,就不会出现黑边效果的bug了。
}
注意:push导航控制器的子控制器时,有黑边
- 经过上面的处理,之后不会出现该bug
return self.childViewControllers.count > 1;
+ 但是如果没有处理就有可能出现黑边
- 原因如下:
+ 如果导航控制器的子控制器的数量大于1,从导航控制器的第一个子控制器滑动到下一个带颜色的子控制器,会有个阴影(因为滑动的子控制器有颜色)
- 解决方案
- 判断导航控制器的子控制器的数量,大于1使右滑手势生效:不是第一个子控制器的时候,在滑动手势的代理方法gestureRecognizerShouldBegin:...,返回YES=》滑动手势生效,否则返回NO=》滑动返回手势不生效
#### 右滑全屏返回按钮
+ 默认系统只提供了控制器的左边滑动功能,而未提供全屏滚动效果
+ 见 [阿峥]简书: //www.greatytc.com/p/bc85a3d37519
- 实现代码如下:
```objc
- (void)viewDidLoad {
[super viewDidLoad];
// 获取系统自带滑动手势的target对象
id target = self.interactivePopGestureRecognizer.delegate;
// 创建全屏滑动手势,调用系统自带滑动手势的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
// 设置手势代理,拦截手势触发
pan.delegate = self;
// 给导航控制器的view添加全屏滑动手势
[self.view addGestureRecognizer:pan];
// 禁止使用系统自带的滑动手势
self.interactivePopGestureRecognizer.enabled = NO;
}
// 什么时候调用:每次触发手势之前都会询问下代理,是否触发。
// 作用:拦截手势触发
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 注意:只有非根控制器才有滑动返回功能,根控制器没有。
// 判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器
if (self.childViewControllers.count == 1) {
// 表示用户在根控制器界面,就不需要触发滑动手势,
return NO;
}
return YES;
}