現(xiàn)實(shí)
大家都知道,系統(tǒng)自帶的右滑返回代兵,必須要從屏幕最左邊開始滑,因?yàn)樗褂玫氖荱IScreenEdgePanGestureRecognizer這個(gè)手勢爷狈。
但是在項(xiàng)目中,產(chǎn)品經(jīng)理會(huì)要求在屏幕任意位置右滑淆院,均可以返回句惯。
最快捷的實(shí)現(xiàn)方案
下面介紹一個(gè)快捷的實(shí)現(xiàn)方案,其原理是將系統(tǒng)的手勢禁止掉抢野,替換為一個(gè)UIPanGestureRecognizer。但是這個(gè)新的手勢各墨,綁定的還是系統(tǒng)手勢的處理動(dòng)作指孤。
直接上代碼吧。
- 定義兩個(gè)屬性
@property (strong, nonatomic) UIPanGestureRecognizer *panToPop;
@property (strong, nonatomic) UIView *targetView;
- 在viewDidLoad里贬堵,獲取系統(tǒng)手勢的target和action恃轩,創(chuàng)建自己的手勢
NSMutableArray *_targets = [self.navigationController.interactivePopGestureRecognizer valueForKey: @"_targets"];
id target = [[_targets firstObject] valueForKey: @"_target"];
SEL handler = NSSelectorFromString(@"handleNavigationTransition:");
self.targetView = self.navigationController.interactivePopGestureRecognizer.view;
//創(chuàng)建pan手勢,作用范圍是全屏
UIPanGestureRecognizer * fullScreenGes = [[UIPanGestureRecognizer alloc]initWithTarget:target action:handler];
fullScreenGes.delegate = self;
self.panToPop = fullScreenGes;
- 在viewDidAppear里使用我們自己的手勢黎做,禁止系統(tǒng)手勢
[self.targetView addGestureRecognizer: self.panToPop];
[self.navigationController.interactivePopGestureRecognizer setEnabled:NO];
- 在viewDidDisappear里恢復(fù)系統(tǒng)手勢叉跛,刪除我們自己的手勢
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
[self.targetView removeGestureRecognizer: self.panToPop];
需要注意的情況
如果不小心將上述代碼,加到了UINavigationController的根視圖控制器上蒸殿,那么會(huì)出現(xiàn)問題筷厘。為了解決此問題,最好是實(shí)現(xiàn)下面的UIGestureRecognizer協(xié)議方法宏所。
- (BOOL)gestureRecognizerShouldBegin:(UIPanGestureRecognizer *)gestureRecognizer {
//防止導(dǎo)航控制器只有一個(gè)rootViewcontroller時(shí)觸發(fā)手勢
return self.navigationController.childViewControllers.count == 1 ? NO : YES;
}