方法一:
1.在ViewDidLoad
方法中添加中劃手勢
// 獲取屏幕邊緣手勢識別器
UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;
// 先禁止系統(tǒng)的左側(cè)滑手勢
gesture.enabled = NO;
// 利用KVC強(qiáng)制獲取手勢數(shù)組
// 利用運(yùn)行時查看私有屬性
NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];
// 獲取這個這個手勢對象
id gestureTarget = [targets firstObject];
// 利用KVC獲取手勢的私有屬性target
id target = [gestureTarget valueForKeyPath:@"_target"];
// 創(chuàng)建滑動手勢
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
// 設(shè)置自定義的手勢代理為控制器,這樣自定義的手勢就會調(diào)用代理的這個方法`gestureRecognizerShouldBegin:`
pan.delegate = self;
// 添加自定義手勢到手勢識別器的View中
[gesture.view addGestureRecognizer:pan];
添加上面的方法后,就可以實(shí)現(xiàn)中間和側(cè)滑都可以返回的功能,但是回到導(dǎo)航控制器的跟界面,任然可以中劃和側(cè)滑,并且跳轉(zhuǎn)出現(xiàn)假死狀態(tài);解決方案很簡單,只要是導(dǎo)航控制器的跟控制器,我們過濾掉這個側(cè)滑和中劃功能;
2.遵守代理協(xié)議,實(shí)現(xiàn)代理的方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
// 這里有兩個條件不允許手勢執(zhí)行:1但惶、當(dāng)前控制器為根控制器;2湿蛔、如果這個push膀曾、pop動畫正在執(zhí)行(私有屬性)
return self.viewControllers.count != 1 && ![[self valueForKey:@"_isTransitioning"] boolValue];
}
方法二:
1.設(shè)置導(dǎo)航控制器的代理為自己,遵守導(dǎo)航控制器代理協(xié)議
@interface DXNavigationController ()<UINavigationControllerDelegate>
self.delegate = self;
2.調(diào)用導(dǎo)航控制器的代理方法
// 導(dǎo)航控制器加載完畢一個View的時候就會調(diào)用這個方法
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
if (viewController == self.childViewControllers[0])
{
[self addGesture:nil];
}else{
[self addGesture:@selector(handleNavigationTransition:)];
}
}
2.1添加自定義手勢
- (void)addGesture:(SEL)action
{
UIScreenEdgePanGestureRecognizer *gesture = (UIScreenEdgePanGestureRecognizer *)self.interactivePopGestureRecognizer;
gesture.enabled = NO;
NSMutableArray *targets = [gesture valueForKeyPath:@"_targets"];
id gestureTarget = [targets firstObject];
id target = [gestureTarget valueForKeyPath:@"_target"];
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:action];
[gesture.view addGestureRecognizer:pan];
}
效果圖:
demo.gif