运行时(runtime)简单来说就是我们通常用swift或oc编写的代码在运行的时候都会通过运行时转换成底层的C(个人理解而已)。
今天通过运行时机制,来实现一个简单的pop全屏手势,现在大部分流行APP中都会添加这个手势。先给大家讲一下,我对这个pop手势的理解思路:
上面的思路想必大家应该好理解(我只是按着我的思路来写的,大家勿喷)。
下面我们直接通过代码来分析:
这里我们根据上面的思路来获取到系统pop手势的target和action :
1. 获取系统的pop手势
```
guard let systemGes = interactivePopGestureRecognizer else { return }
```
2.获取手势添加在哪个View上
```
guard let gesView = interactivePopGestureRecognizer?.view else { return }
```
3.利用运行时机制查看手势的所有属性名称(class_copyIvarList 是获取属性列表)
```
var outCount : UInt32 = 0 // 这里的outCount可以理解为,是来存放属性的一个数组个数(有多少个属性)
let ivars = class_copyIvarList(UIGestureRecognizer.self, &outCount)!;
for i in 0..<outCount {
let ivar = ivars[Int(i)];
let name = ivar_getName(ivar);
print(String(cString: name!));
}
```
到这里,我们查看下print出来的结果:
2.根据我们上面所说的,这里想必大家应该知道我们应该用到那个属性了,这里应该是_targets。我们可以利用这个Key值来获取到一个数组(targets):
```
let targets = systemGes.value(forKey: "_targets") as? [NSObject];
```
3.这个数组里面存放的是对象,我们这里打印一下这个targets数组(数组里面存放在一个字典):
4.我们可以看到里面是个字典,我们先把这个字典给取出来:
```
guard let targetObjc = targets?.first else { return }
```
我们会发现里面有两个key值:一个是action,另一个是target,没错这就是我们想要的。
5.然后通过target这个key值获取target
```
guard let target = targetObjc.value(forKey: "target") else { return }
```
6.取出action,(因为上面我们已经知道action的值了,所以直接拿来用就可以handleNavigationTransition:)
```
let action = Selector(("handleNavigationTransition:"));
```
在这之前,我们已经得到了系统pop时的action和target,接下来我们就是要修改它们
修改手势
创建Pan手势(这些都不需要说了,大家都会,直接上代码)
```
let panGes = UIPanGestureRecognizer();
gesView.addGestureRecognizer(panGes);
panGes.addTarget(target, action: action);//这里的target和action就是我们上面获取到的
```
好了,上面的内容就是一个简单运用运行时修改系统的pop手势了,有什么讲的不对的地方请大家多多包涵!
插点题外话
我也是边学习边分享的,大家不要喷,因为IT这个行业我们大家都懂,技术一直在进步,我们得一直学习,所以大家别嫌麻烦,多学东西是没有坏处的,共勉。
最后预祝所有的IT程序猿在年终拿个自己满意的年终奖,技术一天比一天牛,生活一天比一天好!第一次发帖,多多包涵!