1.在自定义的NavigationController中遵守<UIGestureRecognizerDelegate>。
2.在ViewDidLoad里调用setupSlideGesture方法。
做到以上两步就能实现简单的全屏侧滑,但是如果项目中有的页面navigationBar是需要隐藏的,这时全屏侧滑过渡到这个页面时会很难看,而且还会出现NavigationBar内栈顺序错乱(例如需要隐藏Bar的页面是A,A页面Push出的某个页面为B,这时在页面B上来回拖动但不完全滑到A页面,滑动多次后再滑到A,然后从A再Push到B这时B的NavigationBar上得标题可能就会错乱)。
在需要隐藏NavgationBar的当前VC中添加
[self.navigationControllersetNavigationBarHidden:YESanimated:YES];解决以上问题。
- (void)setupSlideGesture {
UIGestureRecognizer *gesture =self.interactivePopGestureRecognizer;
gesture.enabled =NO;
UIView *gestureView = gesture.view;
UIPanGestureRecognizer *popRecognizer = [[UIPanGestureRecognizeralloc]init];
popRecognizer.delegate =self;
popRecognizer.maximumNumberOfTouches =1;
[gestureView addGestureRecognizer:popRecognizer];
/**
* 获取系统手势的target数组
*/
NSMutableArray *_targets = [gesturevalueForKey:@"_targets"];
/**
* 获取它的唯一对象,我们知道它是一个叫UIGestureRecognizerTarget的私有类,它有一个属性叫_target
*/
id gestureRecognizerTarget = [_targetsfirstObject];
/**
* 获取_target:_UINavigationInteractiveTransition,它有一个方法叫handleNavigationTransition:
*/
id navigationInteractiveTransition = [gestureRecognizerTargetvalueForKey:@"_target"];
/**
* 通过前面的打印,我们从控制台获取出来它的方法签名。
*/
SEL handleTransition =NSSelectorFromString(@"handleNavigationTransition:");
/**
* 创建一个与系统一模一样的手势,我们只把它的类改为UIPanGestureRecognizer
*/
[popRecognizer addTarget:navigationInteractiveTransitionaction:handleTransition];
}
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
/**
* 这里有两个条件不允许手势执行,1、当前控制器为根控制器;2、如果这个push、pop动画正在执行(私有属性)
*/
returnself.viewControllers.count !=1 && ![[selfvalueForKey:@"_isTransitioning"]boolValue];
}