项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能. 
在我们不隐藏 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(右滑返回)

最新文章

  1. Asp.net 面向接口可扩展框架之类型转化基础服务
  2. tomcat 设置jvm内存
  3. 1.CoreLocation 使用,获取当前位置
  4. python语言技巧
  5. ajax上传图片到服务器
  6. IBM powerVM VIOS
  7. iOS-开发日志-UIButton
  8. avi文件格式详解【转】
  9. PHP(w3s) 笔记
  10. 如何参与Hibernate-ORM项目
  11. Android Studio 导入应用时报错 Error:java.lang.RuntimeException: Some file crunching failed, see logs for details
  12. 类模板语法知识体系梳理(包含大量常犯错误demo,尤其滥用友元函数的错误)
  13. Cas 服务器 下载、编译及部署
  14. Informatic 使用过程中的问题
  15. 洛谷 P1078 文化之旅 解题报告
  16. 杭电多校第三场 A Ascending Rating
  17. Centos配置vsftpd
  18. phpstudy集成下Apache配置部署https安全证书
  19. level3
  20. springcloud使用Zuul构建微服务网关入门

热门文章

  1. (三)Cisco dhcp snooping实例1-单交换机(DHCP服务器和DHCP客户端位于同一VLAN)
  2. 把pdf的内容转化为txt文件
  3. node.js使用cluster实现多进程
  4. Artifact tlks: com.intellij.javaee.oss.admin.jmx.JmxAdminException: com.intellij.execution.ExecutionException: E:\IDEAspace\tlksArtfacts\tlks.war not found for the web module.
  5. class文件格式版本号
  6. # advanced packaging
  7. npm install Error: EACCES: permission denied, mkdir
  8. sass、less和stylus 相同与不同
  9. Java 使用ZkClient操作Zookeeper
  10. AES的256位密钥加解密报 java.security.InvalidKeyException: Illegal key size or default parameters 异常的处理及处理工具