[BS-31]导航控制器的interactivePopGestureRecognizer属性

导航控制器的interactivePopGestureRecognizer属性

 

如何自定义导航控制器push出来的视图控制器的左侧返回按钮?

首先需要知道的是:如果要自定义push出来的VC的左侧返回按钮,直接设置vc.navigationItem.backBarButtonItem是不行的。 那么要想自定义返回按钮可以通过以下两种方案:

方案一、 

setBackButtonBackgroundImage 和 setBackButtonTitlePositionAdjustment

UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];  

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  
[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];  

但是这种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。

 

方案二、 直接自定义navigationItem.leftBarButtonItem来替代backBarButtonItem。这种最直接最简单。但是这种方案会使得push出来的VC的右滑pop返回功能失效。

//WZNavigationController.m
//
重写navC的pushVC方法,以便统一设置push进来的vc的左侧“返回”按钮 - (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated { UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom]; btn.bounds = CGRectMake(0, 0, 100, 21); //必须设置尺寸大小 [btn setTitle:@"返回" forState:UIControlStateNormal]; btn.titleLabel.font = [UIFont systemFontOfSize:15]; [btn setTitleColor:[UIColor blackColor] forState:UIControlStateNormal]; [btn setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted]; [btn setImage:[UIImage imageNamed:@"navigationButtonReturn"] forState:UIControlStateNormal]; [btn setImage:[UIImage imageNamed:@"navigationButtonReturnClick"] forState:UIControlStateHighlighted]; //设置btn内容水平靠左 btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft; //设置-10的内边距,让它更靠左(-10特殊用法) btn.contentEdgeInsets = UIEdgeInsetsMake(0, -10, 0, 0); //btn添加事件 [btn addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside]; //**此处自定义了leftBarButtonItem,就会使导航控制器自带的右滑pop返回的功能失效,修复此bug只需在viewDidLoad中将代理清空 viewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc]initWithCustomView:btn]; //当vc被push进入nav时隐藏底部bar viewController.hidesBottomBarWhenPushed = YES; //这句会立即调用被push的VC的viewDidLoad方法,必须放在最后面,否则上面的代码会对viewDidLoad中代码造成覆盖,导致viewDidLoad设置无效。 [super pushViewController:viewController animated:animated]; }

 

苹果一直都在人机交互中尽力做到极致,在iOS7中,新增加了一个小小的功能,也就是这个api:self.navigationController.interactivePopGestureRecognizer.enabled = YES;  这个api功能就是在NavigationController堆栈内的UIViewController可以支持右滑手势,也就是不用点击右上角的返回按钮,轻轻在屏幕左边一滑,屏幕就会返回,随着ios设备屏幕的增大,这个小功能让手指短,拇指大和手残人士看到了福音。

这个功能是好,但是经常我们会有需求定制返回按钮,如果手动定制了返回按钮,这个功能将会失效,也就是自定义了navigationItem的leftBarButtonItem,那么这个手势就会失效。解决方法找到两种:

 

 1.可以在pushViewController之后,还原手势的delegate

[_currentNav pushViewController:viewController animated:YES];  

//还原手势的delegate

_currentNav.interactivePopGestureRecognizer.delegate = nil;  

 

2.在被push的VC的viewWillAppear(不能再viewDidLoad)中写上:

self.navigationItem.backBarButtonItem = backButton;  

self.navigationController.interactivePopGestureRecognizer.delegate = self;  

但这两行代码必须放,相比上一种方式要修改的代码更多,因此建议使用上一种方式

 

3.当然你也可以自己响应这个手势的事件

 [self.navigationController.interactivePopGestureRecognizer addTarget:self action:@selector(handleGesture:)];

这里可以根据自己需要进行选择,如果只是简单定制了返回按钮,第一种最简单,一句代码搞定。

 

参考:http://blog.csdn.net/zhaoxy_thu/article/details/15811189

 

posted @ 2016-06-20 16:52  stevenwuzheng  阅读(553)  评论(0编辑  收藏  举报