当前位置: 首页 > news >正文

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全屏滑动返回(二)

相关文章:

  • c++那些事儿4 0 多态
  • 1.Node.js
  • 使用Doxygen生成C#帮助文档
  • [喵咪大数据]Hadoop集群模式
  • The working copy is locked due to previous error
  • iOS推送Tips
  • mysql5.7二进制编译包的安装
  • 笨办法31做出决定
  • SQL PRIMARY KEY 约束
  • 串口工具
  • python计算器
  • 怎样实现高质量发展(展望2018)
  • 阮一峰JS基础读后感
  • 图像缩放算法【转】
  • 回到网易后开源APM技术选型与实战
  • 【译】理解JavaScript:new 关键字
  •  D - 粉碎叛乱F - 其他起义
  • Effective Java 笔记(一)
  • isset在php5.6-和php7.0+的一些差异
  • Java 内存分配及垃圾回收机制初探
  • leetcode-27. Remove Element
  • leetcode98. Validate Binary Search Tree
  • LintCode 31. partitionArray 数组划分
  • Redis在Web项目中的应用与实践
  • select2 取值 遍历 设置默认值
  • 服务器从安装到部署全过程(二)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 利用jquery编写加法运算验证码
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 如何用vue打造一个移动端音乐播放器
  • 跳前端坑前,先看看这个!!
  • 一道闭包题引发的思考
  • “十年磨一剑”--有赞的HBase平台实践和应用之路 ...
  • 第二十章:异步和文件I/O.(二十三)
  • ​如何使用ArcGIS Pro制作渐变河流效果
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • $.each()与$(selector).each()
  • ( )的作用是将计算机中的信息传送给用户,计算机应用基础 吉大15春学期《计算机应用基础》在线作业二及答案...
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2)MFC+openGL单文档框架glFrame
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)虚幻引擎3--【UnrealScript教程】章节一:20.location和rotation
  • ***php进行支付宝开发中return_url和notify_url的区别分析
  • ***测试-HTTP方法
  • .NET 反射 Reflect
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net分布式压力测试工具(Beetle.DT)
  • .NET企业级应用架构设计系列之开场白
  • /etc/skel 目录作用
  • @Autowired自动装配
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @selector(..)警告提示