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