運(yùn)行時(shí)(runtime)簡(jiǎn)單來說就是我們通常用swift或oc編寫的代碼在運(yùn)行的時(shí)候都會(huì)通過運(yùn)行時(shí)轉(zhuǎn)換成底層的C(個(gè)人理解而已)腌乡。
今天通過運(yùn)行時(shí)機(jī)制斩启,來實(shí)現(xiàn)一個(gè)簡(jiǎn)單的pop全屏手勢(shì),現(xiàn)在大部分流行APP中都會(huì)添加這個(gè)手勢(shì)芳誓。先給大家講一下余舶,我對(duì)這個(gè)pop手勢(shì)的理解思路:
上面的思路想必大家應(yīng)該好理解(我只是按著我的思路來寫的,大家勿噴)锹淌。
下面我們直接通過代碼來分析:
這里我們根據(jù)上面的思路來獲取到系統(tǒng)pop手勢(shì)的target和action :
1. 獲取系統(tǒng)的pop手勢(shì)
```
guard let systemGes = interactivePopGestureRecognizer else { return }
```
2.獲取手勢(shì)添加在哪個(gè)View上
```
guard let gesView = interactivePopGestureRecognizer?.view else { return }
```
3.利用運(yùn)行時(shí)機(jī)制查看手勢(shì)的所有屬性名稱(class_copyIvarList 是獲取屬性列表)
```
var outCount : UInt32 = 0 // 這里的outCount可以理解為匿值,是來存放屬性的一個(gè)數(shù)組個(gè)數(shù)(有多少個(gè)屬性)
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出來的結(jié)果:
2.根據(jù)我們上面所說的赂摆,這里想必大家應(yīng)該知道我們應(yīng)該用到那個(gè)屬性了挟憔,這里應(yīng)該是_targets。我們可以利用這個(gè)Key值來獲取到一個(gè)數(shù)組(targets):
```
let targets = systemGes.value(forKey: "_targets") as? [NSObject];
```
3.這個(gè)數(shù)組里面存放的是對(duì)象库正,我們這里打印一下這個(gè)targets數(shù)組(數(shù)組里面存放在一個(gè)字典):
4.我們可以看到里面是個(gè)字典曲楚,我們先把這個(gè)字典給取出來:
```
guard let targetObjc = targets?.first else { return }
```
我們會(huì)發(fā)現(xiàn)里面有兩個(gè)key值:一個(gè)是action厘唾,另一個(gè)是target褥符,沒錯(cuò)這就是我們想要的。
5.然后通過target這個(gè)key值獲取target
```
guard let target = targetObjc.value(forKey: "target") else { return }
```
6.取出action抚垃,(因?yàn)樯厦嫖覀円呀?jīng)知道action的值了喷楣,所以直接拿來用就可以handleNavigationTransition:)
```
let action = Selector(("handleNavigationTransition:"));
```
在這之前,我們已經(jīng)得到了系統(tǒng)pop時(shí)的action和target鹤树,接下來我們就是要修改它們
修改手勢(shì)
創(chuàng)建Pan手勢(shì)(這些都不需要說了铣焊,大家都會(huì),直接上代碼)
```
let panGes = UIPanGestureRecognizer();
gesView.addGestureRecognizer(panGes);
panGes.addTarget(target, action: action);//這里的target和action就是我們上面獲取到的
```
好了罕伯,上面的內(nèi)容就是一個(gè)簡(jiǎn)單運(yùn)用運(yùn)行時(shí)修改系統(tǒng)的pop手勢(shì)了曲伊,有什么講的不對(duì)的地方請(qǐng)大家多多包涵!
插點(diǎn)題外話
我也是邊學(xué)習(xí)邊分享的,大家不要噴坟募,因?yàn)镮T這個(gè)行業(yè)我們大家都懂岛蚤,技術(shù)一直在進(jìn)步,我們得一直學(xué)習(xí)懈糯,所以大家別嫌麻煩涤妒,多學(xué)東西是沒有壞處的,共勉赚哗。
最后預(yù)祝所有的IT程序猿在年終拿個(gè)自己滿意的年終獎(jiǎng)她紫,技術(shù)一天比一天牛,生活一天比一天好屿储!第一次發(fā)帖贿讹,多多包涵!