项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能. 
在我们不隐藏 NavigationBar 的前提下,系统会自动替我增加此功能,只是它作用的范围仅仅在屏幕左边有限区域. 我们需要在整个界面添加右滑返回的功能 
思路: 利用Runtime 捕获到 系统的全屏Pop手势中所利用的方法,添加到我们需要的View中.

实现思路

我们知道系统的全屏Pop手势为 interactivePopGestureRecognizer 注意此属性仅仅在继承自 UINavigationController 的类里才可用. 
我们的思路应该是取到 UIGestureRecognizer 类中储存 target 和 Action 的属性是哪个?

将 interactivePopGestureRecognizer 的target 和 action 赋值给自定义手势即可实现全屏 pop

1.首先利用 Runtime 打印某类所有变量以及成员属性

/// RunTime 打印类所有属性(包括变量和成员属性)
func printAllPropertyWithRuntime(_ anyClass : AnyClass) {
var count : UInt32 = 0
// 获取某类的所以变量和成员属性
guard let ivars = class_copyIvarList(anyClass, &count) else{ return }
for i in 0..<count {
// 取出属性
guard let ivar = ivars[Int(i)] else { return }
// 获取某属性名称 - 获取到指针
let propertyNamePointer = ivar_getName(ivar)
let propertyNameStr : String = String.init(cString: propertyNamePointer!)
print(propertyNameStr)
}
}

在使用时,在适当位置 调用此方法即可:

printAllPropertyWithRuntime(UIGestureRecognizer.self)

我们获取到 UIGestureRecognizer 所以成员变量以及属性列表 

2.通过 分析 targets 属性最终取到 interactivePopGestureRecognizer 的 target 和 action

/// targets 属性
guard let targetsValue : NSArray = interactivePopGestureRecognizer?.value(forKey: "_targets") as! NSArray? else { return }
print(targetsValue)
/// 拿到 (action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fc44860eb50>)
guard let interactivePopGestureRecognizerTarget : NSObject = targetsValue.lastObject as! NSObject? else { return }
print(interactivePopGestureRecognizerTarget)
// 获取需要的 target
guard let target : Any = interactivePopGestureRecognizerTarget.value(forKey: "target") else { return }
// 获取需要的 action
let action : Selector = Selector(("handleNavigationTransition:"))

4.最终 添加到自定义手势即可实现 全屏 pop 功能

完整实现方法:

 /// 添加全屏 pop 手势
func addFullScreenPopGes() {
guard let targetsValue : NSArray = interactivePopGestureRecognizer?.value(forKey: "_targets") as! NSArray? else { return }
guard let interactivePopGestureRecognizerTarget : NSObject = targetsValue.lastObject as! NSObject? else { return }
// 获取需要的 target
guard let target : Any = interactivePopGestureRecognizerTarget.value(forKey: "target") else { return }
// 获取需要的 action
let action : Selector = Selector(("handleNavigationTransition:"))
let fullScreenPopPan : UIPanGestureRecognizer = UIPanGestureRecognizer(target: target, action: action)
self.view.addGestureRecognizer(fullScreenPopPan)
}

此方法添加到 继承自 UINavigationController 的类中 即可实现全屏 Pop(右滑返回)

iOS-右滑返回,利用Runtime添加全屏Pop手势的更多相关文章

  1. swift - 全屏pop手势

    UINavigationController系统自带有侧滑手势,但是这个手势第一点只能边缘侧滑才可以有效,第二点当手动隐藏系统的导航时,这个手势就不能生效了 为了能到达到全屏pop的效果这里有2中解决 ...

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

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

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

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

  4. iOS页面右滑返回的实现方法总结

    1.边缘触发的系统方法 ①系统返回按钮 self.navigationController.interactivePopGestureRecognizer.enabled = YES;  ②自定义返回 ...

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

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

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

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

  7. swift 关于FDFullscreenPopGesture的右滑返回

    关于导航栏右滑返回的工具库 FDFullscreenPopGesture 是 OC 版本,用了 runtime 等各种骚操作 关于 swift ,我在 UINavigationController 的 ...

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

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

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

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

随机推荐

  1. 【转】vue中样式被覆盖的问题,vue中的style不生效

    转载:http://www.cnblogs.com/shangjun6/p/11416054.html 在我们引入外部的样式时,发现自己无论如何都改不了外部的样式,自己的样式老被覆盖,究其原因还是我们 ...

  2. ajax请求传base64太大,springboot后台无法接收

    ajax请求传base64太大,springboot后台无法接收 .具体体现形式:对应属性值为null 在 application.yml中添加: server: tomcat: max-http-p ...

  3. Netty回调与Channel执行流程分析

    在上一篇的基础上修改代码 1.TestHttpServerHandle  类 package com.example.firstexample; import io.netty.buffer.Byte ...

  4. ListView中嵌入布局的Button或多个点击事件

    有时候在ListView嵌入的布局中有多个事件需要点击,比如一个item中有TextView和Button两个布局,当我们需要获取这两个点击事件时,我们应该如何去获取呢,通常来说,我们都是已经固定好了 ...

  5. 什么是CN2线路

      CN2全称为中国电信下一代承载网,英文Chinatelecom Next Carrier Network,缩写为CNCN,进一步缩写为CN2. CN2线路的优势在哪里 CN2作为“精品网络项目”被 ...

  6. Android adb临时关闭Selinux

    在eng/userdebug版本中 使用getenforce 命令查询当前权限状态,如:adb shell getenforce 使用setenforce 命令进行设置:adb shell seten ...

  7. 修改 commit 历史

    修改 commit 历史 参考:修改 git 历史提交 commit 信息(重写历史)git 修改已提交的内容 git init echo t.md>.gitignore git add .gi ...

  8. 【翻译】Flink Table Api & SQL — Catalog Beta 版

    本文翻译自官网:Catalogs Beta  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table/catalog ...

  9. vagrant报错处理

    vagrant up报错 Warning: Authentication failure. Retrying...解决方案 http://www.cnblogs.com/zqifa/p/vagrant ...

  10. python jieba

    https://www.cnblogs.com/jiayongji/p/7119065.html 安装 pip install jieba 简单用法 结巴分词分为三种模式:精确模式(默认).全模式和搜 ...