導(dǎo)航控制器默認(rèn)自帶了側(cè)滑功能,當(dāng)用戶在界面的左邊滑動(dòng)的時(shí)候,就會(huì)有側(cè)滑功能。但是如何實(shí)現(xiàn)全屏滑動(dòng)返回效果?
分析:
第一步分析:
1.導(dǎo)航控制器的view自帶了滑動(dòng)手勢,只不過手勢的觸發(fā)范圍只能在左邊。
2.當(dāng)用戶在界面左邊拖動(dòng),就會(huì)觸發(fā)滑動(dòng)手勢方法,并且有滑動(dòng)返回功能,說明系統(tǒng)手勢觸發(fā)的方法已經(jīng)實(shí)現(xiàn)了滑動(dòng)返回功能。
3.為什么說系統(tǒng)手勢觸發(fā)的方法已經(jīng)實(shí)現(xiàn)了滑動(dòng)返回功能?
原因:
創(chuàng)建滑動(dòng)手勢對象的時(shí)候,需要綁定監(jiān)聽者,當(dāng)觸發(fā)手勢的時(shí)候會(huì)調(diào)用target的action。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];
當(dāng)用戶在界面左邊滑動(dòng),有滑動(dòng)返回功能,這是因?yàn)橛|發(fā)手勢了,調(diào)用target的action方法,說明action方法內(nèi)部實(shí)現(xiàn)滑動(dòng)返回功能,否則就不會(huì)有滑動(dòng)返回效果。
第二步分析:
打印導(dǎo)航控制器自帶的滑動(dòng)手勢:
NSLog(@"%@",self.interactivePopGestureRecognizer);
得到: <UIScreenEdgePanGestureRecognizer: 0x7fe243d29150; state = Possible; delaysTouchesBegan = YES; view = <UILayoutContainerView 0x7fe243d28d90>; target= <(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fe243d27b30>)>>
可知:
1.系統(tǒng)自帶的手勢是UIScreenEdgePanGestureRecognizer類型對象,屏幕邊緣滑動(dòng)手勢
2.系統(tǒng)自帶手勢target是_UINavigationInteractiveTransition類型的對象
3.target調(diào)用的action方法名叫handleNavigationTransition:
UIScreenEdgePanGestureRecognizer,看名稱就知道,這個(gè)手勢的范圍只能在屏幕的周邊,就是因?yàn)檫@個(gè)手勢,系統(tǒng)自帶的滑動(dòng)效果,只能實(shí)現(xiàn)側(cè)邊滑動(dòng)。
第三步分析:
現(xiàn)在只差target, _UINavigationInteractiveTransition 真實(shí)類型
通過打印系統(tǒng)自帶的滑動(dòng)手勢的代理,發(fā)現(xiàn)正好是_UINavigationInteractiveTransition對象,因此可猜測這個(gè)代理對象就是target對象,只要拿到它,就拿到系統(tǒng)自帶滑動(dòng)手勢的target對象。
// 打印系統(tǒng)自帶滑動(dòng)手勢的代理對象
NSLog(@"%@",self.interactivePopGestureRecognizer.delegate);
得到:<_UINavigationInteractiveTransition: 0x7ffabb732cb0>
實(shí)現(xiàn)代碼:
導(dǎo)航控制器全屏滑動(dòng)注意點(diǎn):
1.禁止系統(tǒng)自帶滑動(dòng)手勢使用。
2.只有導(dǎo)航控制器的非根控制器才需要觸發(fā)手勢,使用手勢代理,控制手勢觸發(fā)。
- (void)viewDidLoad{
[super viewDidLoad];
// 獲取系統(tǒng)自帶滑動(dòng)手勢的target對象
id target = self.interactivePopGestureRecognizer.delegate;
// 一定要記住禁止系統(tǒng)的手勢
self.interactivePopGestureRecognizer.enabled = NO;
//添加自己的全屏滑動(dòng)手勢
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
[self.view addGestureRecognizer:pan];
// 當(dāng)是根控制器的時(shí)候禁止手勢, 當(dāng)不是根控制器的時(shí)候打開手勢
// 設(shè)置手勢代理,攔截手勢觸發(fā),當(dāng)手勢開始滑動(dòng)的時(shí)候就判斷
pan.delegate = self;
}
#pragma mark -UIGestureRecognizerDelegate
//當(dāng)手勢開始滑動(dòng)作用:攔截手勢觸發(fā)
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
//子控制器個(gè)數(shù)只剩下一個(gè)(這一個(gè)就是根控制器),手勢不可用
BOOL open = self.childViewControllers.count != 1;
return open;
}