全局侧滑

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

1.系统自带有侧滑功能,但是只能在边缘处滑动;系统是怎么实现的呢?

2.现在分析一下,当屏幕发生侧滑手势时,控制器会先询问代理,navigationbar的左上角的item是否改变!如果改变,则不执行手势,如果没有改变,则代理会调用handleNavigationTransition:方法,实现侧滑手势;

3.现在,我们先分析一下:如果在控制器询问代理的navigationbar左上角的item是否改变的时候,我们直接不让他询问代理,而是直接调用handleNavigationTransition:方法……这样就能实现不管左上角是否修改,都会执行侧滑手势;

4.再进一步分析,我们自己模仿他的代理,自己添加手势,然后调用handleNavigationTransition:方法,则可以实现全局侧滑功能;

1.系统自带的手势是UIScreenEdgePanGestureRecognizer类型对象,屏幕边缘滑动手势
3.系统自带手势target是_UINavigationInteractiveTransition类型的对象
4.target调用的action方法名叫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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值