iOS-右滑返回,利用Runtime添加全屏Pop手势
项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能.
在我们不隐藏 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手势的更多相关文章
- swift - 全屏pop手势
UINavigationController系统自带有侧滑手势,但是这个手势第一点只能边缘侧滑才可以有效,第二点当手动隐藏系统的导航时,这个手势就不能生效了 为了能到达到全屏pop的效果这里有2中解决 ...
- iOS开发之自定义导航栏返回按钮右滑返回手势失效的解决
我相信针对每一个iOS开发者来说~除了根视图控制器外~所有的界面通过导航栏push过去的界面都是可以通过右滑来返回上一个界面~其实~在很多应用和APP中~用户已经习惯了这个功能~然而~作为开发者的我们 ...
- ios7自定义返回按钮后,右滑返回功能失效解决方法
-(void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated]; //开启ios右滑返回 if ([ ...
- iOS页面右滑返回的实现方法总结
1.边缘触发的系统方法 ①系统返回按钮 self.navigationController.interactivePopGestureRecognizer.enabled = YES; ②自定义返回 ...
- iOS系统右滑返回全局控制方案
前言 今天有个小需求,在点击导航条上的返回按钮之前要调用某个API,并弹出UIAlertView来显示,根据用户的选项判断是否是返回还是继续留在当前控制器.举个简单的例子,当点击导航条上的左上角返回按 ...
- App开发流程之右滑返回手势功能
iOS7以后,导航控制器,自带了从屏幕左边缘右滑返回的手势功能. 但是,如果自定义了导航栏返回按钮,这项功能就失效了,需要自行实现.又如果需要修改手势触发范围,还是需要自行实现. 广泛应用的一种实现方 ...
- swift 关于FDFullscreenPopGesture的右滑返回
关于导航栏右滑返回的工具库 FDFullscreenPopGesture 是 OC 版本,用了 runtime 等各种骚操作 关于 swift ,我在 UINavigationController 的 ...
- App开发流程之右滑返回手势功能续
上一篇记录了利用系统私有变量和方法实现右滑返回手势功能:http://www.cnblogs.com/ALongWay/p/5893515.html 这篇继续记录另一种方案:利用UINavigatio ...
- 全新的手势,侧滑返回、全局右滑返回都OUT啦!
前言 Android快速开发框架-ZBLibrary 最近将以前的 全局右滑返回 手势功能改成了 底部左右滑动手势. 为什么呢?为了解决滑动返回手势的问题. 目前有3种滑动返回手势 一.侧滑返回 代表 ...
随机推荐
- SDN阅读作业(二)
前言碎碎念 当我看到这个全英论文以后,身体和心理都出现了戒断反应,让人无比难受,毕竟自己很久没做过英语阅读理解了.总之,在舍友大佬的帮助下以及各款翻译软件的鼎力支持之下(通篇读完后还是找了中文文献来对 ...
- Comparator中返回0导致数据丢失的大坑
今天对一列数据进行排序,因为存储的是Map结构,要实现排序,马上就想到了TreeMap,于是查到API,这样新建TreeMap就能实现添加的时候就自动排序. new TreeMap<>(n ...
- auto-sklearn
python机器学习-乳腺癌细胞挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003&u ...
- 搭建EOS全节点并接入主网
#EOS编译安装 #!/bin/bash #install.eos.sh #EOS 安装 #从github克隆主网代码 cd /opt git clone https://github.com/EOS ...
- HTTP和HTTPS概念
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- zk单点部署
一.环境准备 当前环境:centos7.3一台软件版本:zookeeper-3.5.2部署目录:/usr/local/zookeeper启动端口:2181配置文件:/usr/local/zookeep ...
- Jmeter-Critical Section Controller(临界区控制器)(还没看,是一个控制请求按顺序执行的东东)
The Critical Section Controller ensures that its children elements (samplers/controllers, etc.) will ...
- PP篇11 增、改生产订单组件BAPI
增.改生产订单组件BAPI BAPI_ALM_ORDER_MAINTAIN USE BAPI_ALM_ORDER_MAINTAIN TO CREATE OR CHANGE PM WORK ORDER ...
- 改进初学者的PID-正反作用
最近看到了Brett Beauregard发表的有关PID的系列文章,感觉对于理解PID算法很有帮助,于是将系列文章翻译过来!在自我提高的过程中,也希望对同道中人有所帮助.作者Brett Beaure ...
- React+antd+less框架搭建步骤,看吧,整的明白儿的
1.node版本 首先你要先看下你的node版本,如果小于10,建议升级到10及以上,因为低版本的 node 在自动创建 react框架时,有配置文件跟10及以上的有比较大的差异,而且需要增加.修改的 ...