侧滑返回功能

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

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

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

首先猜测侧滑返回功能与手势有关,然后去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;  

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容