三种方法:方法1:系统自带的侧滑返回方法
2【8行代码教你搞定导航控制器全屏滑动返回效果】 |那些人追的干货
方案一 :开启使用系统自带的侧滑返回
iOS7之后系统提供了侧滑手势(interactivePopGestureRecognizer),即从屏幕左侧边缘滑起会pop回导航控制器栈的上个viewController。不过如果你自定义了UINavigationViewController或者自定义了返回按钮,系统自带的侧滑返回功能会失效。此时需要添加下面的代码解决:self.navigationController.interactivePopGestureRecognizer.delegate = (id)self;
缺点:
•必须从屏幕边缘左侧滑起才会触发;
•一旦自定义导航控制器或者自定义返回按钮,就会失效。
•优点:实现简单,导航控制器中对全体viewController的侧滑功能可控,系统API绝对安全可靠,无手势冲突
•缺点:侧滑范围局限于左侧
•适用需求:只需左侧小范围触发侧滑时的首选实现方案。
•注:以上代码是强制开启,而系统的侧滑是默认开启的,如果在某一界面 hidesBackButton,那么系统是禁止当前界面的侧滑返回。
•如果实现了以上代码,属于强制开启,那么就算当前界面hidesBackButton,侧滑功能一样开启,通过上面的代理方法可以做到灵活控制哪个界面是否开启侧滑。方案二极其简单取巧的方法iOS7之后是有侧滑返回手势功能的。注意,也就是说系统已经定义了一种手势,并且给这个手势已经添加了一个触发方法(重点)。但是,系统的这个手势的触发条件是必须从屏幕左边缘开始滑动。我们取巧的方法是自己写一个支持全屏滑动的手势,而其触发方法系统已经有,没必要自己实现pop的动画,所以直接就把系统的触发处理方法作为我们自己定义的手势的处理方法。#import "ViewController.h"@interface ViewController ()@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
id target = self.navigationController.interactivePopGestureRecognizer.delegate;
// handleNavigationTransition:为系统私有API,即系统自带侧滑手势的回调方法,我们在自己的手势上直接用它的回调方法
UIPanGestureRecognizer *panGesture = [[UIPanGestureRecognizer alloc] initWithTarget:target action:@selector(handleNavigationTransition:)];
panGesture.delegate = self; // 设置手势代理,拦截手势触发
[self.view addGestureRecognizer:panGesture];
// 一定要禁止系统自带的滑动手势
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}
// 什么时候调用,每次触发手势之前都会询问下代理方法,是否触发
// 作用:拦截手势触发
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
// 当当前控制器是根控制器时,不可以侧滑返回,所以不能使其触发手势
if(self.navigationController.childViewControllers.count == 1)
{
return NO;
}
return YES;
}
@end
优点:最简洁的全屏侧滑实现,导航控制器中对全体viewController的侧滑功能可控
缺点:从右边忘左边划动也能触发侧滑操作,有手势冲突,并不完美。且调用官方私有API
另外:正是缺点的所在,和Cell的侧滑删除手势也是有冲突的,也就是说,免不了需要解决手势的冲突。
适用需求:最好不用,毕竟缺点明显。(不过这个实现思路,确实值得称赞!)
方法三实现(集成最简单、功能最全面):
去上面的链接地址下载DEMO,具体详情见github
转载、