導(dǎo)航控制器默認(rèn)自帶了側(cè)滑功能,當(dāng)用戶在界面的左邊滑動(dòng)的時(shí)候,就會(huì)有側(cè)滑功能
打印導(dǎo)航控制器自帶的滑動(dòng)手勢(shì),看下它的真實(shí)面目。
系統(tǒng)自帶的滑動(dòng)手勢(shì)interactivePopGestureRecognizer
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"%@",self.interactivePopGestureRecognizer);
}

由圖中可知:
1.系統(tǒng)自帶的手勢(shì)是UIScreenEdgePanGestureRecognizer類型對(duì)象,屏幕邊緣滑動(dòng)手勢(shì)
2.系統(tǒng)自帶手勢(shì)target是_UINavigationInteractiveTransition類型的對(duì)象
3.target調(diào)用的action方法名叫handleNavigationTransition:
分析:
UIScreenEdgePanGestureRecognizer,看名稱就知道,這個(gè)手勢(shì)的范圍只能在屏幕的周邊,就是因?yàn)檫@個(gè)手勢(shì),系統(tǒng)自帶的滑動(dòng)效果,只能實(shí)現(xiàn)側(cè)邊滑動(dòng)
實(shí)現(xiàn)自定義導(dǎo)航欄全屏滑動(dòng)返回
給自己的導(dǎo)航控制器,添加一個(gè)全屏的滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法,利用系統(tǒng)實(shí)現(xiàn)的滑動(dòng)返回功能,加上自己全屏滑動(dòng)手勢(shì),就有全屏滑動(dòng)功能了。
問(wèn)題:如何拿到系統(tǒng)自帶的target對(duì)象?,action方法名已經(jīng)知道,而且系統(tǒng)肯定在target對(duì)象實(shí)現(xiàn)了,只要拿到target對(duì)象,調(diào)用這個(gè)方法就行。
通過(guò)打印系統(tǒng)自帶的滑動(dòng)手勢(shì)的代理,發(fā)現(xiàn)正好是_UINavigationInteractiveTransition對(duì)象,因此我猜測(cè)這個(gè)代理對(duì)象就是target對(duì)象,只要拿到它,就拿到系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
- (void)viewDidLoad {
[super viewDidLoad];
// 獲取系統(tǒng)自帶滑動(dòng)手勢(shì)的target對(duì)象
id target = self.interactivePopGestureRecognizer.delegate;
// 創(chuàng)建全屏滑動(dòng)手勢(shì),調(diào)用系統(tǒng)自帶滑動(dòng)手勢(shì)的target的action方法
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
// 設(shè)置手勢(shì)代理,攔截手勢(shì)觸發(fā)
pan.delegate = self;
// 給導(dǎo)航控制器的view添加全屏滑動(dòng)手勢(shì)
[self.view addGestureRecognizer:pan];
// 禁止使用系統(tǒng)自帶的滑動(dòng)手勢(shì)
self.interactivePopGestureRecognizer.enabled = NO;
}
// 什么時(shí)候調(diào)用:每次觸發(fā)手勢(shì)之前都會(huì)詢問(wèn)下代理,是否觸發(fā)。
// 作用:攔截手勢(shì)觸發(fā)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 注意:只有非根控制器才有滑動(dòng)返回功能,根控制器沒(méi)有。
// 判斷導(dǎo)航控制器是否只有一個(gè)子控制器,如果只有一個(gè)子控制器,肯定是根控制器
if (self.childViewControllers.count == 1) {
// 表示用戶在根控制器界面,就不需要觸發(fā)滑動(dòng)手勢(shì),
return NO;
}
return YES;
}