iOS利用运行时机制(runtime)实现pop全屏手势

运行时(runtime)简单来说就是我们通常用swift或oc编写的代码在运行的时候都会通过运行时转换成底层的C(个人理解而已)。


今天通过运行时机制,来实现一个简单的pop全屏手势,现在大部分流行APP中都会添加这个手势。先给大家讲一下,我对这个pop手势的理解思路:

iOS利用运行时机制(runtime)实现pop全屏手势_第1张图片
thought

上面的思路想必大家应该好理解(我只是按着我的思路来写的,大家勿喷)。


下面我们直接通过代码来分析:

这里我们根据上面的思路来获取到系统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..

let ivar = ivars[Int(i)];

let name = ivar_getName(ivar);

print(String(cString: name!));

}

```

到这里,我们查看下print出来的结果:

iOS利用运行时机制(runtime)实现pop全屏手势_第2张图片
print

2.根据我们上面所说的,这里想必大家应该知道我们应该用到那个属性了,这里应该是_targets。我们可以利用这个Key值来获取到一个数组(targets):

```

let targets = systemGes.value(forKey: "_targets") as? [NSObject];

```

3.这个数组里面存放的是对象,我们这里打印一下这个targets数组(数组里面存放在一个字典):

targets

4.我们可以看到里面是个字典,我们先把这个字典给取出来:

```

guard let targetObjc = targets?.first else { return }

```

targetObjc

我们会发现里面有两个key值:一个是action,另一个是target,没错这就是我们想要的。

5.然后通过target这个key值获取target

```

guard let target = targetObjc.value(forKey: "target") else { return }

```

target

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程序猿在年终拿个自己满意的年终奖,技术一天比一天牛,生活一天比一天好!第一次发帖,多多包涵!

你可能感兴趣的:(iOS利用运行时机制(runtime)实现pop全屏手势)