先描述一下侧滑的整个流程:
1.系统自带有侧滑功能,但是只能在边缘处滑动;系统是怎么实现的呢?
2.现在分析一下,当屏幕发生侧滑手势时,控制器会先询问代理,navigationbar的左上角的item是否改变!如果改变,则不执行手势,如果没有改变,则代理会调用handleNavigationTransition:方法,实现侧滑手势;
3.现在,我们先分析一下:如果在控制器询问代理的navigationbar左上角的item是否改变的时候,我们直接不让他询问代理,而是直接调用handleNavigationTransition:方法……这样就能实现不管左上角是否修改,都会执行侧滑手势;
</a>4.再进一步分析,我们自己模仿他的代理,自己添加手势,然后调用handleNavigationTransition:方法,则可以实现全局侧滑功能;
//代码实现
//在UINavigationController中实现全局侧滑
@interface UINavigationController()<UIGestureRecognizerDelegate,UINavigationControllerDelegate>
@end
@implementation UINavigationController
-(void)viewDidLoad{
//获取系统自带滑动手势的target对象
id taget = self.interactivePopGestureRecognizer.delegate;
//因为调用handleNavigationTransition会报警告,所以添加一行下边的代码,具体意义可以百度;
//#pragma clang diagnostic ignored "-Wundeclared-selector"
//添加拖拽手势
UIPanGestureRecognizer * pan = [[UIPanGestureRecognizer alloc] initWithTarget:taget action:@selector(handleNavigationTransition:)];
//因为在root控制器内时,是不需要全局侧滑功能的,如果不取消根控制器的侧滑功能,会出现"假死"状态,所以使用手势的代理判断当前控制器是不是根控制,如果是根控制器,则不执行手势,如果不是根控制器,则执行手势;
pan.delegate = self;
//将其代理置nil,则系统侧滑功能不起作用;也可以使用
//self.interactivePopGestureRecognizer.enabled = NO;
self.interactivePopGestureRecognizer.delegate = nil;
[self.view addGestureRecognizer:pan];
}
//实现手势代理方法
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer{
//判断当前控制器是否是根控制器;
return (self.childViewControllers.count != 1);
}
@end
导航控制器全屏滑动注意点:
1.禁止系统自带滑动手势使用。
2.只有导航控制器的非根控制器才需要触发手势,使用手势代理,控制手势触发。
完成、这样就搞定了, 亲测此方法会与界面有滑动手势的产生冲突,因此有第二种方法!
以上方法参考原文链接如下:http://www.cocoachina.com/ios/20150811/12897.html?utm_source=tuicool)
方法二:实现自定义导航控制器边缘滑动返回
方法二的实现原理和方法一一样,只不过它还是使用的系统的边缘手势实现侧滑返回功能。只需要在每个类里面添加如下代码块:
写在.m中, 别忘了遵守 UIGestureRecognizerDelegate协议。
//当前导航控制器
@property (nonatomic, strong) UIViewController *currentShowVC;
-(void)viewWillAppear:(BOOL)animated {
//设置代理
self.navigationController.interactivePopGestureRecognizer.delegate =(id)self;
//启用系统自带的滑动手势
self.navigationController.interactivePopGestureRecognizer.enabled = YES;
//判断导航控制器是否只有一个子控制器,如果只有一个子控制器,肯定是根控制器,这里我的项目是有tabbar,所以在页面切换之间设置是否显示tababr。
if (self.navigationController.viewControllers.count == 1){
//将当前导航控制器置空
self.currentShowVC = Nil;
[SharedAppDelegate setTabBarHidden:NO animated:YES];
}else{
如果不是根控制器,就设置当前导航控制器为其本身。
self.currentShowVC = self;
[SharedAppDelegate setTabBarHidden:YES animated:NO];
}
}
手势的代理方法
-(BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
if (gestureRecognizer == self.navigationController.interactivePopGestureRecognizer) {
当前导航控制器是根视图控制器
//the most important
return (self.currentShowVC == self.navigationController.topViewController);
不要隐藏tabbar
[SharedAppDelegate setTabBarHidden:NO animated:NO];
}
return YES;
}
网友评论