导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能。
导航控制器的view自带了滑动手势,当用户在界面左边拖动,就会触发滑动手势方法,并且有滑动返回功能,说明系统手势触发的方法已经实现了滑动返回功能。
系统自带的滑动手势interactivePopGestureRecognizer ,打印出来:
NSLog(@"%@",self.interactivePopGestureRecognizer);
打印结果:
由图中可知:
1.系统自带的手势是UIScreenEdgePanGestureRecognizer类型对象,屏幕边缘滑动手势
2.系统自带手势target是_UINavigationInteractiveTransition类型的对象
3.target调用的action方法名叫handleNavigationTransition:
实现全屏滑动功能
添加一个全屏的滑动手势,调用系统滑动手势的target的action方法,利用系统实现的滑动返回功能,加上自己全屏滑动手势,就有全屏滑动功能了。 打印delegate:
NSLog(@"%@",self.interactivePopGestureRecognizer.delegate);
导航控制器全屏滑动注意点:
1.禁止系统自带滑动手势使用。
2.只有导航控制器的非根控制器才需要触发手势,使用手势代理,控制手势触发。
代码:
- (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;
}