今天遇到了在iOS7上使用leftBarButtonItem却无法响应滑动返回事件的问题,一番谷歌,最后终于解决了,在这里把解决方案分享给大家。

在iOS7之前的系统,如果要自定义返回按钮,直接设置backBarButtonItem是不行的,有两种方式,一种是用leftBarButtonItem替代;一种是:

[plain] view
plain
copy

  1. UIImage *backButtonImage = [[UIImage imageNamed:@"Graphics/Shared/navigation_back_button.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(0, 0, 0, 0)];
  2. [[UIBarButtonItem appearance] setBackButtonBackgroundImage:backButtonImage  forState:UIControlStateNormal barMetrics:UIBarMetricsDefault];
  3. [[UIBarButtonItem appearance] setBackButtonTitlePositionAdjustment:UIOffsetMake(0, backButtonImage.size.height*2) forBarMetrics:UIBarMetricsDefault];

但第二种方法只能自定义返回按钮的背景和文字,如果要自定义上面的图标则不行。所以使用leftBarButtonItem是最佳方式。

但是在iOS7系统中,自带了可以通过右滑返回上一级页面的手势,如果仅仅修改leftBarButtonItem是无法响应这个手势的。可以在pushViewController之后加入如下代码:

[plain] view
plain
copy

  1. [_currentNav pushViewController:viewController animated:YES];
  2. //开启iOS7的滑动返回效果
  3. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  4. _currentNav.interactivePopGestureRecognizer.delegate = nil;
  5. }

这样即可完美解决iOS7上无法滑动的问题。

当然网上还有一种解决方法是在设置leftBarButtonItem之后加上:

[plain] view
plain
copy

  1. self.navigationItem.backBarButtonItem = backButton;
  2. self.navigationController.interactivePopGestureRecognizer.delegate = self;

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

响应了iOS7的滑动返回手势之后,我们还会发现一个问题,iOS7的滑动返回不会调用我们给leftBarButtonItem设置的回调,那么返回的事件如何捕捉呢?可以通过以下代码:

[plain] view
plain
copy

  1. - (void)viewWillDisappear: (BOOL)animated
  2. {
  3. [super viewWillDisappear: animated];
  4. if (![[self.navigationController viewControllers] containsObject: self])
  5. {
  6. // the view has been removed from the navigation stack, back is probably the cause
  7. // this will be slow with a large stack however.
  8. }
  9. }

至此,我们就完美解决了iOS7上使用leftBarButtonItem的滑动返回问题。

有朋友提出以上方式在多次滑动之后会导致界面假死,这里再给出一种解决方案:

在所有除一级页面之外的页面的viewDidAppear和viewWillDisappear中加入以下代码:

[objc] view
plain
copy

  1. - (void)viewWillDisappear:(BOOL)animated {
  2. [super viewWillDisappear:animated];
  3. //代理置空,否则会闪退
  4. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  5. self.navigationController.interactivePopGestureRecognizer.delegate = nil;
  6. }
  7. }
[objc] view
plain
copy

  1. - (void)viewDidAppear:(BOOL)animated {
  2. [super viewDidAppear:animated];
  3. //开启iOS7的滑动返回效果
  4. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  5. //只有在二级页面生效
  6. if ([self.navigationController.viewControllers count] == 2) {
  7. self.navigationController.interactivePopGestureRecognizer.delegate = self;
  8. }
  9. }
  10. }

在uinavigationcontroller的delegate中实现以下方法:

[objc] view
plain
copy

  1. - (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
  2. //开启滑动手势
  3. if ([navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  4. navigationController.interactivePopGestureRecognizer.enabled = YES;
  5. }
  6. }

在pushviewcontroller之前加入以下代码:

[objc] view
plain
copy

  1. //在切换界面的过程中禁止滑动手势,避免界面卡死
  2. if ([_currentNav respondsToSelector:@selector(interactivePopGestureRecognizer)]) {
  3. _currentNav.interactivePopGestureRecognizer.enabled = NO;
  4. }
  5. [_currentNav pushViewController:viewController animated:YES];

即可在实现滑动返回的同时,避免界面卡死的问题。

如果大家觉得对自己有帮助的话,还希望能帮顶一下,谢谢:)
转载请注明出处,谢谢!

iOS7上leftBarButtonItem无法实现滑动返回的完美解决方案的更多相关文章

  1. 小程序webview跳转页面后没有返回按钮完美解决方案

    随着小程序越来越火爆,使一个产品如果只有公众号H5页面和APP显得不怎么完美,总感觉不搭上小程序这趟流量车,就会少了点什么,心里别扭地很.在此驱动下,我所在公司也决定赶紧上车. 但是,如果要按照小程序 ...

  2. 安卓手机上微信无法打开Https网址的完美解决方案

    1,第三方网站检测网站的SSL证书是否正确的安装 https://www.geocerts.com/ssl-checker,大概率你会看到下边的场景,一个证书链完整的警告,如果想知道我的基础配置是什么 ...

  3. (转载)Android滑动冲突的完美解决

    Android滑动冲突的完美解决 作者:softwindy_brother 字体:[增加 减小] 类型:转载 时间:2017-01-24我要评论 这篇文章主要为大家详细介绍了Android滑动冲突的完 ...

  4. iOS7滑动返回

    [转载请注明出处] iOS 7中在传统的左上角返回键之外,提供了右滑返回上一级界面的手势.支持此手势的是UINavigationController中新增的属性 interactivePopGestu ...

  5. iOS7下滑动返回与ScrollView共存二三事

    [转载请注明出处] = =不是整篇复制就算注明出处了亲... iOS7下滑动返回与ScrollView共存二三事 [前情回顾] 去年的时候,写了这篇帖子iOS7滑动返回.文中提到,对于多页面结构的应用 ...

  6. 类似IOS的滑动返回上一级,SwipeBackLayout-android的滑动返回类库

    最近,公司在开发App的需求中增加了一个新的需求,要在android的页面中增加向右滑动的时候返回上一级页面.我刚知道这个需求的时候,感觉有点坑,可能设计那边最近接触到知乎的客户端或者是IOS的滑动可 ...

  7. 禁用ios7 手势滑动返回功能

    禁用ios7 手势滑动返回功能 版权声明:本文为博主原创文章,未经博主允许不得转载. 在有的时候,我们不需要手势返回功能,那么可以在页面中添加以下代码: - (void)viewDidAppear:( ...

  8. Android 使用SwipeBackLayout实现滑动返回上一级页面——实战来袭

    我们知道.APP在设计上习惯性的把返回button放在屏幕的左上角,那么,在非常多时候(尤其是大屏幕手机),操作改返回button,就会有诸多不便了.为了更加方便实现"返回"功能. ...

  9. iOS 如何设置导航的滑动返回手势, 和系统饿一样

    iOS 7 滑动返回那些事儿 2014/05/17 Wei .entry-meta .entry-header 在智能机越来越普及,屏幕越做越大的当下,滑动返回手势已经成为了一个应用的标配功能,甚至可 ...

随机推荐

  1. 第四周总结&第二次实验报告

    实验二 Java简单类与对象 实验目的 掌握类的定义,熟悉属性.构造函数.方法的作用,掌握用类作为类型声明变量和方法返回值: 理解类和对象的区别,掌握构造函数的使用,熟悉通过对象名引用实例的方法和属性 ...

  2. [2019杭电多校第四场][hdu6614]AND Minimum Spanning Tree(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6614 题目大意是有一张n个点的完全图,n个点点权为1-n,边权为两点点权按位与(&).求最小生 ...

  3. python爬虫相关安装与应用

    1.mysql数据库用于存储大量数据. 2.Navicat for MySQL以图形和表格等形式管理数据库工具. 3.编程语言python3与环境配置 4.pythcharm集成开发环境(社区版)不需 ...

  4. python小感悟(初学者)

    计算机语言的起源: 在计算机刚发明出来的时候,是一大堆的机械硬件,然后技术人员开发了操作系统,操作系统是最底层的软件,负责与硬件沟通,执行其他软件的命令.由于计算机只能识别0和1两种特殊的机器语言,所 ...

  5. webpack搭建vue项目开发环境【文档向学习】

    为何有这篇文章 各个社区已经有无数篇帖子介绍如何使用webpack搭建前端项目,但无论是出于学习webpack的目的还是为了解决工作实际需要都面临着一个现实问题,那就是版本更新.别人的帖子可能刚写好版 ...

  6. 题解 P5265 【模板】多项式反三角函数

    →_→ OI 生涯晚期才开始刷板子题的咱 其实这题就是道公式题,搞过多项式全家桶的同学贴贴板子照着公式码两下都能过... 至于公式的证明嘛...总之贴上公式: \[Arcsin(F)=\int{F'\ ...

  7. 收集慕课网讲解的border知识

    1.使用boeder辅助background-posi定位 2.使用border实现三道杠图标 3.利用border实现--鼠标放上去后,改变图标的颜色

  8. Python笔记(读取txt文件中的数据)

    在机器学习中,常常需要读取txt文本中的数据,这里主要整理了两种读取数据的方式 数据内容 共有四列数据,前三列为特征值,最后一列为数据标签 40920 8.326976 0.953952 3 1448 ...

  9. VirtualBox虚拟机与主机互通,并且虚拟机又能上网配置

    1.在Virtualbox 的全局模式下建立host-only网络,完成之后在网络邻居的属性中会出现本地连接和virtualbox host-only ethernet 连接 2.点击本地连接的属性, ...

  10. C#设计模式:享元模式(Flyweight Pattern)

    一,什么是享元模式? 享元模式(Flyweight Pattern):采用共享技术来避免大量拥有相同内容对象的开销,主要用于减少创建对象的数量,以减少内存占用和提高性能 1,根本的思路就是对象的重用2 ...