美文网首页
侧滑返回功能

侧滑返回功能

作者: Gumball_a45f | 来源:发表于2019-12-16 20:31 被阅读0次

    既要自定义返回按钮,也要侧滑返回功能!!

    当我们用自定义的按钮覆盖了系统的返回按钮时,侧滑返回功能会失效。

    为什么系统按钮被覆盖后侧滑返回功能会失效?系统又做了些什么事情。

    首先猜测侧滑返回功能与手势有关,然后去navigationController.m文件中搜索gestur,猜测与interactivePopGestureRecognizer属性有关,并且是iOS7后才有的功能

    interactivePopGestureRecognizer

    为了验证他们的关系,将返回按钮设置为系统的,然后设置手势代理,重写代理方法,设置为不接收触摸事件

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {  

      return NO;  

    }

    发现侧滑返回功能失效,确定了与手势有关,猜测是覆盖原有的返回按钮时系统将该代理方法设置为NO。

    为了解决该问题,我是在按钮覆盖前先用了将代理设置为nil,

        self.interactivePopGestureRecognizer.delegate = nil;

    让系统无法调用代理方法处理侧滑失效的问题。 发现可以解决当下的问题,当时有一个坑,就是当在根控制器时进行侧滑,会发生程序还在运行但界面死掉的问题。

    最后的解决方法是在重写的- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch 代理方法中进行判断,若不是根控制器则返回yes,否则返回no.

    全屏侧滑返回

    打印self.interactivePopGestureRecognizer.delegate,看代理调用了什么方法

    <(action=handleNavigationTransition:,  

    target=<_UINavigationInteractiveTransition 0x7fe5adf25b20>)>

    创建pan手势,让pan手势执行handleNavigationTransition:方法(该方法实现侧滑返回),target等于侧滑返回手势的代理对象(self.interactivePopGestureRecognizer.delegate),添加手势到navigationController.view中,设置pan手势的代理对象,重写手势代理(shouldReceiveTouch)方法,根目录不接收手势

    /*      全屏返回手势      */     //不要系统手势     self.interactivePopGestureRecognizer.enabled = NO;          id target = self.interactivePopGestureRecognizer.delegate;     //创建pan手势,     UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:target action:@selector(handleNavigationTransition:)];     pan.delegate = self;     [self.view addGestureRecognizer:pan];

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{  

     if (self.childViewControllers.count >1) {    

            return YES;    

        }  

      return NO;  

    }

    相关文章

      网友评论

          本文标题:侧滑返回功能

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