既要自定义返回按钮,也要侧滑返回功能!!
当我们用自定义的按钮覆盖了系统的返回按钮时,侧滑返回功能会失效。
为什么系统按钮被覆盖后侧滑返回功能会失效?系统又做了些什么事情。
首先猜测侧滑返回功能与手势有关,然后去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;
}
网友评论