1.边缘触发的系统方法

①系统返回按钮

self.navigationController.interactivePopGestureRecognizer.enabled = YES;

 ②自定义返回按钮

 1. self.navigationController.interactivePopGestureRecognizer.enabled = YES;             2. self.navigationController.interactivePopGestureRecognizer.delegate = self;

在viewDidLoad里面加入这两行代码,遵循UIGestureRecognizerDelegate协议,当前的viewcontroller即可以实现该向右滑动后退功能,但是当回到navigationController的rootView中再次做出向右滑动时,程序会有问题(再次push子controller时,程序卡在当前界面无法跳转).有效解决方案如下:

说明:有两个controllerA,B

navigationController的rootview设置为A,在A中点击按钮后push B.在A的 -(void)viewDidAppear:(BOOL)animated方法中加入self.navigationController.interactivePopGestureRecognizer.enabled = NO;

2.全屏触发的自定义方法

2.1 自定义所有控制器的父类,在全屏范围内添加右滑手势,触发返回事件。

  在viewDidLoad中,创建UIPanGestureRecognizer,并添加到导航栏控制器上。

- (void) viewDidLoad {
[super viewDidLoad]; //1.获取系统interactivePopGestureRecognizer对象的target对象
id target = self.navigationController.interactivePopGestureRecognizer.delegate; //2.创建滑动手势,taregt设置interactivePopGestureRecognizer的target,所以当界面滑动的时候就会自动调用target的action方法。
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] init];
[pan addTarget:target action:NSSelectorFromString(@"handleNavigationTransition:")];
pan.delegate = self; //3.添加到导航控制器的视图上
[self.navigationController.view addGestureRecognizer:pan]; //4.禁用系统的滑动手势
self.navigationController.interactivePopGestureRecognizer.enabled = NO;
}

在滑动开始的触发事件中控制除了根视图控制器以外的所有控制器执行右滑事件。

#pragma mark - 滑动开始触发事件
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer {
//只有导航的根控制器不需要右滑的返回的功能。
if (self.navigationController.viewControllers.count <= 1) {
return NO;
} return YES;
}

这种实现方法在一定程度上解决了问题,但有局限性。一是其触发是在所有次级控制器上作用,若部分控制器不需要该功能无法取消手势;二是在实际应用中可能导致手势冲突或因手指右滑停止而再返回原页面而引起错误或崩溃。

2.2 从底层入手,创建一个UINavigationController的分类(category),从根本上解决右滑返回的问题。

这一成果来自Github上forkingdog的开源项目,使用方法很简单,只需在你的项目中导入UINavigationController+FDFullscreenPopGesture这一分类,编译通过后即可实现全屏幕的右滑返回,若需在某一个页面取消事件,只需要引入UINavigationController+FDFullscreenPopGesture.h文件,然后在viewDidLoad方法中设置self.navigationController.fd_fullscreenPopGestureRecognizer.enabled = NO,并在上一个页面的viewWillAppear方法中设置self.navigationController.fd_fullscreenPopGestureRecognizer.enabled = YES,就可自如地控制各个页面的右滑返回效果实现与否。这一方法稳定而简便地解决了问题。

iOS页面右滑返回的实现方法总结的更多相关文章

  1. iOS系统右滑返回全局控制方案

    前言 今天有个小需求,在点击导航条上的返回按钮之前要调用某个API,并弹出UIAlertView来显示,根据用户的选项判断是否是返回还是继续留在当前控制器.举个简单的例子,当点击导航条上的左上角返回按 ...

  2. iOS 开发 右滑返回上一级控制器

    #import <objc/runtime.h> @interface UINavigationController (Transition)<UIGestureRecognizer ...

  3. iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决

    我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...

  4. SwipeBackLayout的使用方法,右滑返回

    使用方法: 需要右滑返回的activity继承baseActivity就可以, 如: public class SettingActivity extends BaseActivity {} 为防止滑 ...

  5. ios7自定义返回按钮后,右滑返回功能失效解决方法

    -(void)viewWillAppear:(BOOL)animated{     [super viewWillAppear:animated];     //开启ios右滑返回     if ([ ...

  6. 第二十六篇、因为自定item(nav)而使系统右滑返回手势失效的解决方法

    @interface ViewController () <uigesturerecognizerdelegate> @end@implementation ViewController ...

  7. App开发流程之右滑返回手势功能续

    上一篇记录了利用系统私有变量和方法实现右滑返回手势功能:http://www.cnblogs.com/ALongWay/p/5893515.html 这篇继续记录另一种方案:利用UINavigatio ...

  8. App开发流程之右滑返回手势功能

    iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方 ...

  9. 全新的手势,侧滑返回、全局右滑返回都OUT啦!

    前言 Android快速开发框架-ZBLibrary 最近将以前的 全局右滑返回 手势功能改成了 底部左右滑动手势. 为什么呢?为了解决滑动返回手势的问题. 目前有3种滑动返回手势 一.侧滑返回 代表 ...

随机推荐

  1. bat 获取当前路径

    @echo offsetlocal EnableDelayedExpansionecho 当前正在运行的批处理文件所在路径:!cd!pause @echo off echo 当前目录是:%cd% pa ...

  2. UUID 生成32位随机串

    java通过jdk自带的UUID,生成32位的随机串 private static String generate_UUID() { UUID uuid=UUID.randomUUID(); Stri ...

  3. android开发小内容

    EditText弹出输入数字:android:inputType="phone"

  4. 面试中的一些小问题之ES5和ES6的区别?

    1995年,JavaScript作为网景浏览器的一部分首次发布,起初并不叫JavaScript,而是叫LiveScript,但是因为当时Java正火,也算是为了搭上java的顺风车,于是改成了Java ...

  5. PHP开发心得一

    1,php获得服务器时间 $time= date('Y-m-d H:i'); echo $time; 一般写法如上,但发现打印出来的时间小时数总数不对,和机器的时间差几个小时.查资料发现,要设定时区. ...

  6. JDBC性能优化

    一.使用PreparedStatement的Batch功能 参见本人一下文章:http://blog.csdn.net/lmb55/article/details/50631062 二.选择合适的光标 ...

  7. SDK _ 静态控件的使用

    静态控件的使用 静态控件主要区分两种使用方式:文本 \ 图片 在使用静态控件的时候,ID始终默认为 IDC_STATIC,需要进行更改 怎样通过可视化编程显示一张图片 需要添加一个位图资源 需要添加一 ...

  8. day18-常用模块III (numpy、pandas、matplotlib)

    目录 numpy模块 创建矩阵 获取矩阵的行列数 切割矩阵 矩阵元素替换 矩阵的合并 通过函数创建矩阵 矩阵的运算 矩阵的点乘与转置 矩阵的逆 矩阵的其他操作 numpy.random生成随机数 pa ...

  9. mysqlworkbench 执行update语句报错:You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column

    You are using safe update mode and you tried to update a table without a WHERE that uses a KEY colum ...

  10. 【6.24校内test】T1 江城唱晚

    [题目背景] 墙角那株海棠,是你种下的思念. 生死不能忘,高烛照容颜. 一曲江城唱晚,重忆当年坐灯前, 青衫中绣着你留下的线. ——银临<江城唱晚> [问题描述] 扶苏是个喜欢一边听古风歌 ...