iOS利用運行時機制(runtime)實現(xiàn)pop全屏手勢

運行時(runtime)簡單來說就是我們通常用swift或oc編寫的代碼在運行的時候都會通過運行時轉(zhuǎn)換成底層的C(個人理解而已)。


今天通過運行時機制,來實現(xiàn)一個簡單的pop全屏手勢,現(xiàn)在大部分流行APP中都會添加這個手勢。先給大家講一下,我對這個pop手勢的理解思路:

thought

上面的思路想必大家應(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é)果:

print

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ù)組里面存放在一個字典):

targets

4.我們可以看到里面是個字典,我們先把這個字典給取出來:

```

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

```

targetObjc

我們會發(fā)現(xiàn)里面有兩個key值:一個是action,另一個是target,沒錯這就是我們想要的。

5.然后通過target這個key值獲取target

```

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

```

target

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ā)帖,多多包涵!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容