导航控制器的interactivePopGestureRecognizer属性

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

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

方案一、

setBackButtonBackgroundImage 和 setBackButtonTitlePositionAdjustment

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

[[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];

[[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(, backButtonImage.size.height*) 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(, , , ); //必须设置尺寸大小
[btn setTitle:@"返回" forState:UIControlStateNormal];
btn.titleLabel.font = [UIFont systemFontOfSize:];
[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(, -, , );
//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

[BS-31]导航控制器的interactivePopGestureRecognizer属性的更多相关文章

  1. IOS开发UI篇—导航控制器属性和基本使用

    IOS开发UI篇—导航控制器属性和基本使用 一.导航控制器的一些属性和基本使用 1.把子控制器添加到导航控制器中的四种方法 (1) 1.创建一个导航控制器 UINavigationController ...

  2. 关于ios导航控制器的知识总结

    关于ios导航控制器的知识总结 添加了导航控制器后: 1.一个导航控制器会有一个顶部导航栏navigationbar和一个底部工具栏toolbar,它们是导航控制器navC的属性.且导航栏默认是不隐藏 ...

  3. 多界面开发 、 导航控制器(NavigationController)

    1 VC之间的跳转和正向传值 1.1 问题 在实际的开发中更多的应用都会有多个页面组成,每个页面展示不同的信息,页面之间的跳转是由视图控制器来实现的,本案例实现两个页面的之间的跳转和页面之间的正向传值 ...

  4. (导航控制器view)全屏幕滑动实现pop效果

    看到现在app 中越来越流行的手势滑动实现pop效果,心里很是痒痒跃跃欲试,经过多方查看资料,终于在简书上找到了详细的实现方案: 轻松学习之二——iOS利用Runtime自定义控制器POP手势动画 经 ...

  5. iOS导航控制器常用函数与navigationBar常用属性

    导航控制器常用函数触发时机 当视图控制器的View将要出现时触发 - (void)viewWillAppear:(BOOL)animated 当视图控制器的View已经出现时触发 - (void)vi ...

  6. UINavigationController导航控制器初始化 导航控制器栈的push和pop跳转理解

    (1)导航控制器初始化的时候一般都有一个根视图控制器,导航控制器相当于一个栈,里面装的是视图控制器,最先进去的在最下面,最后进去的在最上面.在最上面的那个视图控制器的视图就是这个导航控制器对外展示的界 ...

  7. iOS开发UINavigation——导航控制器UINavigationController

    iOS开发UINavigation系列一——导航栏UINavigtionBar摘要iOS中的导航条可以附着于导航控制器之中使用,也可以在controller中单独使用,这篇博客,主要讨论有关导航栏的使 ...

  8. IOS开发之功能模块--自定义导航控制器类常用自定义的代码

    前言:本文篇幅不多,但是涉及到的内容却是开发中常用的. 涉及的内容: 1.统一设置导航控制器子控制器的返回按钮. 2.因为修改了系统的返回按钮,所以还需要设置手势事件. 3.隐藏底部的工具条. 这里直 ...

  9. 截获导航控制器系统返回按钮的点击pop及右滑pop事件

    前几天看了@栾小布的一篇文章:Custom backBarButtonItem,在跟着做的时候我又顺便扩展了一些,写此文章的目的是为了总结一下自己所写的东西,方便以后翻看容易,同时也是自己入行iOS一 ...

随机推荐

  1. Zend studio 10.6 配置XDEBUG

    1. 查看PHP版本,下载XDebug     然后去网站http://xdebug.org/download.php下载相应的XDEBUG, 把下载好的文件放到相应的PHP下的EXT目录下,替换之前 ...

  2. [WP8.1UI控件编程]Windows Phone大数据量网络图片列表的异步加载和内存优化

    11.2.4 大数据量网络图片列表的异步加载和内存优化 虚拟化技术可以让Windows Phone上的大数据量列表不必担心会一次性加载所有的数据,保证了UI的流程性.对于虚拟化的技术,我们不仅仅只是依 ...

  3. 如何伪装成为一名前端(JS方向)

    作为一个菜鸟级别的.NET开发者,在连服务器都没搞定的情况下,要研究前端,这是在扯淡,不过,迫于工作的需要,时常需要去前端打杂,所以经常伪装成为一名前端,有时候竟产生错觉,去应聘Y一份前端work吧. ...

  4. JS:操作样式表1:行内样式

    //访问元素样式1, stye属性只对行内样式有用 var box = document.getElementById("box"); // alert(box.style.col ...

  5. spring源码学习之路---IOC实现原理(三)

    作者:zuoxiaolong8810(左潇龙),转载请注明出处,特别说明:本博文来自博主原博客,为保证新博客中博文的完整性,特复制到此留存,如需转载请注明新博客地址即可. 上一章我们已经初步认识了Be ...

  6. JAVA复制网络图片到本地

    import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.Out ...

  7. text-indent:-9999px 字体隐藏问题

    为什么要字体隐藏? 通常为了传达更好的视觉效果,我们常用图片替代掉字体.但是为了html语义化,常常要给内容模块加上一些标题来让页面更有意义,在抛开css裸奔的情况下也能很顺利的汲取到页面信息.为此我 ...

  8. 安装redis和php的redis扩展

    一.安装Redis 在服务器上下载好最新的redis解压包后,解压 #tar -zxvf redis-3.2.0-tar-gz #cd redis-3.2.0-tar-gz #make (redis- ...

  9. tab1

    <html> <head> <meta charset="UTF-8"> <title>tab</title> < ...

  10. :nth-child(an+b)

    语法: :nth-child(an+b)为什么选择它,因为我认为,这个选择器是最多学问的一个了.很可惜,据我所测,目前能较好地支持她的只有Opera9+和Safari3+. 描述: 伪类:nth-ch ...