美文网首页
给系统添加一个全局侧滑

给系统添加一个全局侧滑

作者: 小刘_假装是个程序员 | 来源:发表于2017-12-09 13:53 被阅读0次

先描述一下侧滑的整个流程:

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;

}

相关文章

网友评论

      本文标题:给系统添加一个全局侧滑

      本文链接:https://www.haomeiwen.com/subject/ulwuixtx.html