iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案
在iOS7之前的系统,如果要自定义返回按钮,直接设置backBarButtonItem是不行的,有两种方式,一种是用leftBarButtonItem替代;一种是:
- 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];
但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。
但是在iOS7系统中,自带了可以通过右滑返回上一级页面的手势,如果仅仅修改leftBarButtonItem是无法响应这个手势的。可以在pushViewController之后加入如下代码:
- [_currentNav pushViewController:viewController animated:YES];
- //开启iOS7的滑动返回效果
- if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- _currentNav.interactivePopGestureRecognizer.delegate = nil;
- }
这样即可完美解决iOS7上无法滑动的问题。
当然网上还有一种解决方法是在设置leftBarButtonItem之后加上:
- self.navigationItem.backBarButtonItem = backButton;
- self.navigationController.interactivePopGestureRecognizer.delegate = self;
但这两行代码必须放在viewWillAppear中,相比上一种方式要修改的代码更多,因此建议使用上一种方式。
响应了iOS7的滑动返回手势之后,我们还会发现一个问题,iOS7的滑动返回不会调用我们给leftBarButtonItem设置的回调,那么返回的事件如何捕捉呢?可以通过以下代码:
- - (void)viewWillDisappear: (BOOL)animated
- {
- [super viewWillDisappear: animated];
- if (![[self.navigationController viewControllers] containsObject: self])
- {
- // the view has been removed from the navigation stack, back is probably the cause
- // this will be slow with a large stack however.
- }
- }
至此,我们就完美解决了iOS7上使用leftBarButtonItem的滑动返回问题。
有朋友提出以上方式在多次滑动之后会导致界面假死,这里再给出一种解决方案:
在所有除一级页面之外的页面的viewDidAppear和viewWillDisappear中加入以下代码:
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- //代理置空,否则会闪退
- if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- self.navigationController.interactivePopGestureRecognizer.delegate = nil;
- }
- }
- - (void)viewDidAppear:(BOOL)animated {
- [super viewDidAppear:animated];
- //开启iOS7的滑动返回效果
- if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- //只有在二级页面生效
- if ([self.navigationController.viewControllers count] == 2) {
- self.navigationController.interactivePopGestureRecognizer.delegate = self;
- }
- }
- }
在uinavigationcontroller的delegate中实现以下方法:
- - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
- //开启滑动手势
- if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- navigationController.interactivePopGestureRecognizer.enabled = YES;
- }
- }
在pushviewcontroller之前加入以下代码:
- //在切换界面的过程中禁止滑动手势,避免界面卡死
- if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
- _currentNav.interactivePopGestureRecognizer.enabled = NO;
- }
- [_currentNav pushViewController:viewController animated:YES];
即可在实现滑动返回的同时,避免界面卡死的问题。
iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案的更多相关文章
- 小程序webview跳转页面后没有返回按钮完美解决方案
随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...
- 安卓手机上微信无法打开Https网址的完美解决方案
1,第三方网站检测网站的SSL证书是否正确的安装 https://www.geocerts.com/ssl-checker,大概率你会看到下边的场景,一个证书链完整的警告,如果想知道我的基础配置是什么 ...
- (转载)Android滑动冲突的完美解决
Android滑动冲突的完美解决 作者:softwindy_brother 字体:[增加 减小] 类型:转载 时间:2017-01-24我要评论 这篇文章主要为大家详细介绍了Android滑动冲突的完 ...
- iOS7滑动返回
[转载请注明出处] iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势.支持此手势的是UINavigationController中新增的属性 interactivePopGestu ...
- iOS7下滑动返回与ScrollView共存二三事
[转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...
- 类似IOS的滑动返回上一级,SwipeBackLayout-android的滑动返回类库
最近,公司在开发App的需求中增加了一个新的需求,要在android的页面中增加向右滑动的时候返回上一级页面.我刚知道这个需求的时候,感觉有点坑,可能设计那边最近接触到知乎的客户端或者是IOS的滑动可 ...
- 禁用ios7 手势滑动返回功能
禁用ios7 手势滑动返回功能 版权声明:本文为博主原创文章,未经博主允许不得转载. 在有的时候,我们不需要手势返回功能,那么可以在页面中添加以下代码: - (void)viewDidAppear:( ...
- Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭
我们知道.APP在设计上习惯性的把返回button放在屏幕的左上角,那么,在非常多时候(尤其是大屏幕手机),操作改返回button,就会有诸多不便了.为了更加方便实现"返回"功能. ...
- iOS 如何设置导航的滑动返回手势, 和系统饿一样
iOS 7 滑动返回那些事儿 2014/05/17 Wei .entry-meta .entry-header 在智能机越来越普及,屏幕越做越大的当下,滑动返回手势已经成为了一个应用的标配功能,甚至可 ...
随机推荐
- 重置Docker里的gitlab管理员用户密码
1.docker ps 找出容器的唯一标识 2.docker exec -it ad9b8c3e20f0 /bin/bash 进入Docker容器运行环境 3.开始重置gitlab管理员用户密码 ...
- “希希敬敬对”队软件工程第九次作业-beta冲刺第一次随笔
队名: “希希敬敬对” 龙江腾(队长) 201810775001 杨希 201810812008 何敬上 201810812004 今日讨论会议照片一张: 每个人 ...
- [19/05/17-星期五] HTML_body标签(内嵌标签)和框架标签
一.内嵌标签 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <!- ...
- Maven-Eclipse使用maven创建HelloWorld Java项目,使用Junit-4.11的注解
1.针对前面创建的mavenTest项目,我们做一些修改,包括pom.xml.App.java.AppTest.java 说明:其中的scope属性,如果是test,表示该依赖只对测试有效,如果不声明 ...
- 本地SVN服务器的搭建(WINDOWS环境)
1.下载安装 VISUALSVN SERVER 1.1下载地址:https://www.visualsvn.com/server/download/ 1.2下载完成后,双击安装. 2.下载安装 Tor ...
- opencv中画圆circle函数和椭圆ellipse函数
1. void ellipse(InputOutputArray img, Point center, Size axes, double angle, double startAngle, ...
- 数组去重,排序,重复次数,两个数组合并,两个数组去重,map(),filter(),reduce()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- C# Xml.Serialization 节点重命名
XmlElement 节点重命名 XmlRoot 根节点重名称 XmlArray List集合添加根节点 XmlArrayItem List集合中子节点重命名 [Serializable] 将该类标记 ...
- EPROCESS ETHREAD PEB重要成员
-----------------------------------------------------------------------win7 x86中-------------------- ...
- VUE:v-for获取列表前n个数据、中间范围数据、末尾n条数据的方法
说明: 1.开发使用的UI是mintUI, 要求: 1.获取6到13之间的数据:items.slice(6,13) <mt-cell v-for="(item,index) in it ...