思路
首先你總要知道interactivePopGestureRecognizer
株灸,這是導(dǎo)航控制器的一個(gè)邊界滑動返回手勢,我們說輕松擎值,其實(shí)就是基于這個(gè)手勢來做的慌烧,通過打印可以看到它是一個(gè)Pan手勢,所以我們的思路就是在自定義導(dǎo)航控制器中創(chuàng)建一個(gè)UIPanGestureRecognizer
鸠儿,把Target
跟Action
都設(shè)置成interactivePopGestureRecognizer
的Target
跟Action
屹蚊,這樣就可以通過我們的Pan手勢來做interactivePopGestureRecognizer
所做的事情了??。
問題
如何獲取interactivePopGestureRecognizer
的Target
跟Action
?
從打印可以看出进每,action=handleNavigationTransition:
汹粤,所以Action
可以直接通過@selector()
來取,而Target
其實(shí)就是手勢的代理田晚,我們也來打印驗(yàn)證一下
NSLog(@"delegate==%@",self.interactivePopGestureRecognizer.delegate);
顯然Target就是手勢代理嘱兼。
步驟
- 創(chuàng)建導(dǎo)航控制器基類,只要有需要添加全屏滑動返回的贤徒,繼承它就好芹壕。
- 創(chuàng)建
UIPanGestureRecognizer
指向interactivePopGestureRecognizer
的Target
跟Action
。 - Pan手勢代理中添加相關(guān)判斷約束接奈。
代碼
- (void)addFullScreenPopPanGesture{
self.fullScreenPopPanGesture = [[UIPanGestureRecognizer alloc]initWithTarget:self.interactivePopGestureRecognizer.delegate action:@selector(handleNavigationTransition:)];
self.fullScreenPopPanGesture.delegate = self;
[self.view addGestureRecognizer:self.fullScreenPopPanGesture];
[self.interactivePopGestureRecognizer requireGestureRecognizerToFail:self.fullScreenPopPanGesture];
self.interactivePopGestureRecognizer.enabled = NO;
}
#pragma mark -- UIGestureRecognizerDelegate
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if ([gestureRecognizer isEqual:self.fullScreenPopPanGesture]) {
//獲取手指移動后的相對偏移量
CGPoint translationPoint = [self.fullScreenPopPanGesture translationInView:self.view];
//向右滑動 && 不是跟視圖控制器
if (translationPoint.x > 0 && self.childViewControllers.count > 1) {
return YES;
}
return NO;
}
return YES;
}
注意
- API是iOS7以后的踢涌,所以低于iOS7的就自然不能如此了。
-
必須將自帶的
interactivePopGestureRecognizer
關(guān)閉序宦,以及兩者共存時(shí)自帶的手勢失效睁壁,以防在其他地方又開啟,導(dǎo)致沖突挨厚。 - 需要在代理中判斷是往右滑且不是根控制器才生效堡僻,避免跟其他手勢沖突。