iOS - 实现UINavigation全屏滑动返回(一)

要点

interactivePopGestureRecognizer 是UINavigationController自带手势,当我们自定义了导航条的返回按钮后,这个手势就自动失效了,也就是说无法滑动返回。

条件

很多情况下我们不得不自定义导航条的返回按钮,但是我们也要滑动返回上一级的效果。

思路

既然自动失效,那我们就告诉它什么时候生效。

  • 在非根控制器下生效(用于滑动返回上一级)
  • 在根控制器下失效(防止根控制器被移除,当然系统不会让我们把它移除,只是会出现bug)

苹果官方文档说明 翻译:第一个被添加的控制器成为永远不会被出栈的根控制器

步骤

自定义一个 UINavigationController ,即继承于 UINavigationController ,名字为 LXFNavigationController ,将代理设为自己,遵守协议 UINavigationControllerDelegate ,�实现代理方法 navigationController:didShowViewController:animated:

代码

LXFNavigationController.m

/** 系统手势代理 */
@property(nonatomic, strong) id popGesture;
- (void)viewDidLoad {
 [super viewDidLoad];

  // 记录系统手势代理
  self.popGesture = self.interactivePopGestureRecognizer;
  self.delegate = self;
}
#pragma mark - UINavigationControllerDelegate
// 当控制器显示完毕的时候调用
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
    // 根据 栈 先进后出
    if (self.viewControllers[0] == viewController) { // 根控制器
        // 还原代理
        self.interactivePopGestureRecognizer.delegate = self.popGesture;
    } else { // 非控制器
        // 清空手势代理就能实现滑动返回,iOS6不支持
        self.interactivePopGestureRecognizer.delegate = nil;
    }
    // 如果当前控制器为根控制器,则使手势失效,不然手势会将根控制器移除
    if (self.viewControllers.count == 1) {
        self.interactivePopGestureRecognizer.enabled = NO;
    } else {
        self.interactivePopGestureRecognizer.enabled = YES;
    }
}

只有左侧边缘滑动才有效

附上Demo

最后说两句

这样就可以了,但是注意了,现在实现的是滑动返回功能,并没有全屏滑动返回~~接下来看下一篇吧 iOS - 实现UINavigation全屏滑�动返回(二)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏跟着阿笨一起玩NET

几款代码混淆器(DotFuscator, .NET Reactor, xenocode)(转)

921
来自专栏Youngxj

[源码分享]Emlog博客后台自适应主题 N+

4724
来自专栏Java成神之路

GEF入门实例_总结_04_Eclipse插件启动流程分析

这6个文件对RCP应用程序而言非常重要,可能我们现在对这几个文件的理解还是云里雾里,这一节我们将通过这几个文件来了解Eclipse插件的启动过程。

1014
来自专栏程序猿DD

一文告诉你,Intellij IDEA神器隐藏的11种实用小技巧!

我们可以使用【Presentation Mode】,将IDEA弄到最大,可以让你只关注一个类里面的代码,进行毫无干扰的coding。

1203
来自专栏前端大白专栏

基于mpvue开发微信小程序,vue能用的,用mpvue哪些情况不能用

2607
来自专栏微信公众号:Java团长

Intellij IDEA神器居然还有这些小技巧

Intellij IDEA真是越用越觉得它强大,它总是在我们写代码的时候,不时给我们来个小惊喜。出于对Intellij IDEA的喜爱,我决定写一个与其相关的专...

672
来自专栏木子墨的前端日常

前端项目性能优化笔记

饱暖思淫欲,当我们完成基本的业务需求之后,我们就需要去思考一下如何是我们的业务更加的流畅、代码更健壮等等,以下是我在项目中做的一些基本的项目优化工作,小小记录一...

873
来自专栏雪胖纸的玩蛇日常

Vue+koa2开发一款全栈小程序(6.个人中心)

如果报错(往往因为mysql的版本8.0什么的,加密方式导致初始化脚本报错),解决办法

1622
来自专栏mantou大数据

MacOS下SVN迁移Git踩坑记

1. First Blood 之前在Windows环境下进行svn到git的迁移是很简单的,参考官方文档。 可是在macOS环境下(macOS High Si...

4535
来自专栏一“技”之长

iOS9系列专题6——iOS9其他适配注意点 原

        在iOS8中,APP的定位服务apple就做了一些修改,需要用户申请相应的权限,并在info.plist文件中添加对应的键值。具体的做法在这篇博...

573

扫码关注云+社区