滑动返回功能被覆盖的解决思路

在OC开发中,导航控制器是一个非常常见的控件,而且在不少使用时候,我们需要自定义导航条NavigationBar。但是这个做法可能带来一些小麻烦,下面是我遇到的问题以及解决方案的思维过程。

在苹果内部,返回功能的实现自带了一个边缘的滑动返回功能。但是一旦使用我们自定义的NavigationBar,子控制器这个功能便会消失。如果我们既要用到自定义,又要保留滑动返回功能,那我们首先要分析消失的原因,再来寻找解决方案。

既然替换NavigationBar会导致滑动返回功能的消失,那我们基本可以确定,在NavigationBar当中会有某些属性某些方法实现了这个功能。那么需要进一步考虑系统做了哪些事,哪些会导致滑动功能失效。

由于滑动功能肯定需要手势,我们可以先从手势进行分析。又因为滑动返回手势是iOS7.0以后推出的,而且添加手势是添加到UINavigationController的view上,那我们直接点进去搜索关键字“gesture”

出现有且只有一个符合我们条件的属性。那我们可以大胆推测滑动返回功能跟interactivePopGestureRecognizer有关系,所以直接打印它的值来观察。

刚好它的值中有个与屏幕边缘的手势相关,进一步验证我们的猜想。那么就可以用最简单粗暴的方法来确认,直接“干掉”该方法,如果功能失效,那肯定与它相关,那我们可以考虑尝试代理,通过interactivePopGestureRecognizer让滑动返回功能失效。

首先让控制器成为interactivePopGestureRecognizer的代理,在代理方法中把识别手势方法的返回值改为NO,不出所料,滑动功能无法实现。

为了确认该属性本来就存在着代理,顺便把代理属性的值也打印出来。

这也可以证明了猜想的正确性。那么下一步就是考虑如何在使用自定义导航条(NavigationBar)的基础上,使滑动功能继续实现。

首先尝试直接把代理属性清空,不让它继续控制屏幕滑动,确实实现了自定义NavigationBar后继续滑动的返回功能。但明显也会带来bug,造成导航控制器view也可以滑动,而且滑动后造成了界面的假死,所以不能把代理设置为nil。那我们继续使用控制器作为代理,考虑通过控制手势在根控制器上不能滑动来修复该bug。

在手势控制时加入判断,如果该控制器为根控制器,那么手势将不会触发,如果为子控制器,能够正常使用。最终达到项目要求,在使用自定义NavigationBar的前提下实现原有的滑动返回功能。

时间: 2024-10-17 23:38:38

滑动返回功能被覆盖的解决思路的相关文章

iOS之手势滑动返回功能-b

iOS中如果不自定义UINavigationBar,通过手势向右滑是可以实现返回的,这时左边的标题文字提示的是上一个ViewController的标题,如果需要把文字改为简约风格,例如弄过箭头返回啥的,那么你需要自定义UINavigationBar,但当你自定义navigationBar后,这个功能就会自动失效. 屏蔽右滑返回功能代码:   if ([self.navigationController respondsToSelector:@selector(interactivePopGest

iOS 7的手势滑动返回功能

现在使用默认模板创建的iOS App都支持手势返回功能,如果导航栏的返回按钮是自定义的那么则会失效,也可以参考这里手动设置无效. if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enabled = NO; } 如果是因为自定义导航按钮而导

iOS彩票项目--第五天,新特性引导页的封装、返回按钮的自定义、导航控制器的滑动返回以及自定义滑动返回功能

一.上次实现了在AppDelegate中通过判断app版本决定是否进入新特性页面,今天将AppDelegate中的一坨进行了封装.将self.window的根控制器到底应该为新特性界面,还是主页面,封装到了导航工具类ChaosGuideTool 封装,先决定外面怎么用,然后实现方法.外部通过类方法调用  + (UIViewController *)chooseRootVC; 外部的APPDelegate 只是调用方法 之前的业务判断没有改变,只是将数据的存储进行了封装 二.返回按钮的自定义 <1

滑动返回的延伸(全局滑动返回功能)

上一篇文章提到自定义导航条(NavigationBar)覆盖系统返回按钮,导致滑动功能消失的解决方法后,有朋友提出有时候会遇到一些别的要求,比如要设置一个全屏滑动返回的功能,顾名思义在屏幕任何位置都能实现右滑返回. 其实如果滑动功能的解决思路和过程,这个方案并不难实现,或者说比解决滑动功能消失更简单.首先我们可以先解决以下问题:为什么系统手势不能全屏?那我们可以把手势属性打印出来分析. Edge是边缘的意思,那很有可能系统用这个方法只能控制边缘的滑动返回,我们可以点进去进一步观察. 可见 UIS

猫猫学iOS 之微博项目实战(6)导航控制器NavigationController 的滑动回退功能实现

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果 第二篇里面写了怎样自定义navigation实现自定义的导航控制器左右按钮样式,但是当我们自己实现后,系统自带的向右边滑动来实现回退的功能就不能用了. 这里主要实现滑动回退功能 . 二:代码实现思路 首先 在 NYNavigationController.m中放一个popDelegate来放置要更改的手势代理对象 @interface NYNaviga

全屏滑动返回

#import "XMGNavigationViewController.h" @interface XMGNavigationViewController ()<UIGestureRecognizerDelegate> @end @implementation XMGNavigationViewController - (void)viewDidLoad { [super viewDidLoad]; UIPanGestureRecognizer *pan = [[UIPa

iOS 7的手势滑动返回

如今使用默认模板创建的iOS App都支持手势返回功能,假设导航栏的返回button是自己定义的那么则会失效,也能够參考这里手动设置无效. [cpp] view plaincopy if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecognizer)]) { self.navigationController.interactivePopGestureRecognizer.enab

iOS开发——实用技术OC篇&amp;8行代码教你搞定导航控制器全屏滑动返回效果

8行代码教你搞定导航控制器全屏滑动返回效果 前言 此次文章,讲述的是导航控制器全屏滑动返回效果,而且代码量非常少,10行内搞定. 效果如图: 如果喜欢我的文章,可以关注我,也可以来小码哥,了解下我们的iOS培训课程.陆续还会有更新ing.... 一.自定义导航控制器 目的:以后需要使用全屏滑动返回功能,就使用自己定义的导航控制器. 二.分析导航控制器侧滑功能 效果:导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能. 系统自带的侧滑效果: 分析: 1.导航控制器的view

iOSUI-导航控制器全屏滑动返回效果

导航控制器默认自带了侧滑功能,当用户在界面的左边滑动的时候,就会有侧滑功能.但是如何实现全屏滑动返回效果? 分析: 第一步分析: 1.导航控制器的view自带了滑动手势,只不过手势的触发范围只能在左边. 2.当用户在界面左边拖动,就会触发滑动手势方法,并且有滑动返回功能,说明系统手势触发的方法已经实现了滑动返回功能. 3.为什么说系统手势触发的方法已经实现了滑动返回功能? 原因: 创建滑动手势对象的时候,需要绑定监听者,当触发手势的时候会调用target的action. UIPanGesture