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种滑动返回手势 一.侧滑返回 代表 ...
随机推荐
- tomcat监控工具-probe
概述 今天给大家介绍一款开袋即食的性能监控工具,居家性能测试必备! tomcat监控工具:probe tomcat probe是一个开源的监控tomcat运行状态工具,可以实时查看项目运行的情况,监控 ...
- cesium常用设置【转】
https://blog.csdn.net/D_Walker/article/details/82188514 1.加载线上cesium代码<link href="http://ces ...
- EF6中的SQL监控
在MVC或WEBAPI中的监控 System.Action<string> action = (string message) => { Debug.WriteLine(messag ...
- Python实现PIL将图片转成字符串
# -*- coding: utf-8 -*- # author:baoshan from PIL import Image, ImageFilter codeLib = '''@#$%&?* ...
- Java的方法类型
1.无参数无返回值的方法 package com.imooc.method; public class MethodDemo { public static void printStar() { Sy ...
- LeetCode 993. Cousins in Binary Tree(判断结点是否为Cousin)
993. Cousins in Binary Tree In a binary tree, the root node is at depth 0, and children of each dept ...
- k8s记录-ubuntu安装docker
sudo apt-get purge docker-ce sudo rm -rf /var/lib/dockerdocker-ce:https://download.docker.com/linux/ ...
- (转)IIS windows认证
转自 https://my.oschina.net/u/2551141/blog/2878673 IIS配置Windows认证方式: 1.IIS->>要设置的网站->>身份验证 ...
- Archer和ArcherUI配置说明
如果Bladex的网关端口是80,则需要修改Archer服务端口,并修改ArcherUI的vue.config.js的端口
- c-lodop回调函数简短问答及相关博文
回调函数相关博文:C-Lodop回调函数的触发.LODOP.FORMAT格式转换[回调和直接返回值].Lodop导出excel及提示成功[回调和直接返回值].c-lodop获取任务页数-回调里给全局变 ...