需求:当页面跳转的时候, 能够全屏滑动返回
- 完整实现的方法需要自定义全屏手势... 今天说一个快速的解决办法----利用系统自带的滑动返回功能
- 使用环境:push跳转, 系统自带的只能左侧边缘滑动返回, 不能全平滑
- 先看效果(蓝色是首页, 滑动蓝色边缘是为了测试 bug, 后面有说):
怎么能够实现全屏滑动, 下面一步步分析
- 大多数情况下, 我们都会利用apperance来修改navBar的左侧返回Item样式, 替换掉系统原有的
/** push时,设置leftBtnItem*/
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// NSLog(@"%zd", self.childViewControllers.count);
if (self.childViewControllers.count > 0) {
viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageWithRenderingOriginalName:@"NavBack"] style:UIBarButtonItemStylePlain target:self action:@selector(popBack)];
viewController.hidesBottomBarWhenPushed = YES;
}
[super pushViewController:viewController animated:animated];
}
- 但是替换掉系统原有的会造成一个bug, 就是不能滑动返回了, 侧边滑动都不行
- 分析, 为什么没有滑动效果了
- 因为我们替换掉了系统原有的 backButtunItem, 导致navgationController中interactivePopGestureRecognizer这个属性的代理失效了, 所以不能滑动返回了
- 解决:设置interactivePopGestureRecognizer. delegate = nil就可以恢复侧边滑动返回
- bug:这样会产生一个 bug, 首页侧边滑动的时候会假死
- 解决 bug:
当处于首页时, 我们恢复interactivePopGestureRecognizer的默认代理就不会有这个bug 了
//判断当前显示的控制器为根控制器时,就启用系统的代理,否则,不启用
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
// NSLog(@"%@", viewController);
if (viewController == self.childViewControllers[0]) {
self.interactivePopGestureRecognizer.delegate = self.interactivePopGesDelegate;
}else{
self.interactivePopGestureRecognizer.delegate = nil;
}
}
]
处理全屏滑动返回
- 只要将系统的手势替换成我们自己的全屏滑动手势就行了
- 当然滑动返回的功能还是系统帮我们做, 所以我们我们要拿到系统的滑动返回方法
- 打印
id target = self.interactivePopGestureRecognizer.delegate;
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
// JJLOG(@"%@", self.interactivePopGestureRecognizer);
self.interactivePopGestureRecognizer.enabled = NO;
pan.delegate =self;
[self.view addGestureRecognizer:pan];