有時(shí)自定義了導(dǎo)航欄的一些東西嘶卧,全局返回手勢(shì)便會(huì)失效岩臣。可能很多人會(huì)通過第三方來解決這個(gè)問題火俄,如FDFullscreenPopGesture這個(gè)第三方,這個(gè)第三方使用起來非常簡(jiǎn)單讲冠,只要將相關(guān)文件加入到自己的項(xiàng)目中即可瓜客,器內(nèi)部中使用了一些運(yùn)行時(shí)相關(guān)的知識(shí)。今天我們也來看看如何拋棄這個(gè)第三方竿开,用不到十行的代碼來解決這個(gè)全局返回手勢(shì)的問題谱仪。同樣也是運(yùn)用到一些運(yùn)行時(shí)的知識(shí),但是只是使用運(yùn)行時(shí)查看了一些隱藏的屬性否彩,實(shí)際代碼中并沒有涉及到疯攒。今天用swift來寫這幾行代碼吧。首先申明一點(diǎn)列荔,一下幾行代碼都是在自定義的navigationController中實(shí)現(xiàn)的敬尺。
//這是自定義UINavigationController子類中的方法。
override func viewDidLoad() {
super.viewDidLoad()
// 1.獲取系統(tǒng)的Pop手勢(shì)
guard let systemGes = interactivePopGestureRecognizer else { return }
// 2.獲取手勢(shì)添加到的View中
guard let gesView = systemGes.view else { return }
// 3.獲取target/action
// 3.1.這里利用運(yùn)行時(shí)機(jī)制查看所有的屬性名稱贴浙,該屬性名稱是對(duì)外隱藏的砂吞。有興趣的可以了解下,怎樣利用運(yùn)行時(shí)查看屬性列表
let targets = systemGes.value(forKey: "_targets") as? [NSObject]
guard let targetObjc = targets?.first else { return }
// 3.2.取出target
guard let target = targetObjc.value(forKey: "target") else { return }
// 3.3.取出Action
let action = Selector(("handleNavigationTransition:"))
// 4.創(chuàng)建自己的Pan手勢(shì)
let panGes = UIPanGestureRecognizer()
gesView.addGestureRecognizer(panGes)
panGes.addTarget(target, action: action)
}
就這么簡(jiǎn)單崎溃,比什么第三方蜻直,自己寫一些邏輯代碼,簡(jiǎn)單太多了袁串。直接拿過來概而,放在自定義navigationController中就可以使用。哈哈????????