實(shí)現(xiàn)思路
@available(iOS 7.0, *)
open var interactivePopGestureRecognizer: UIGestureRecognizer? { get }
iOS 7.0系統(tǒng)增加了滑動(dòng)的pop手勢(shì),可惜的是響應(yīng)范圍太小,只是屏幕的邊緣位置.
我們可以利用runtime
+KVC
來(lái)獲取到系統(tǒng)的interactivePopGestureRecognizer
手勢(shì),并將其添加到view
上來(lái)實(shí)現(xiàn)全屏pop.
- 使用運(yùn)行時(shí),打印手勢(shì)中所有屬性,可以看到其中的
_targets
屬性(具體實(shí)現(xiàn)中不需要此段代碼)
var count : UInt32 = 0
let ivars = class_copyIvarList(UIGestureRecognizer.self, &count)!
for i in 0..<count {
let nameP = ivar_getName(ivars[Int(i)])!
let name = String(cString: nameP)
print(name)
}
- 使用KVC獲取
interactivePopGestureRecognizer
的_targets
并打印第一個(gè)元素的屬性
guard let targets = interactivePopGestureRecognizer!.value(forKey: "_targets") as? [NSObject] else {
return
}
let targetObjc = targets[0]
print(targetObjc)
上述代碼兩次的打印結(jié)果@2x.png
- 最后利用獲取到的
target
和action
創(chuàng)建手勢(shì)添加到view
上
let target = targetObjc.value(forKey: "target")
let action = Selector(("handleNavigationTransition:"))
let panGes = UIPanGestureRecognizer(target: target, action: action)
view.addGestureRecognizer(panGes)
完整代碼
自定義UINavigationController
import UIKit
class SANNavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
guard let targets = interactivePopGestureRecognizer!.value(forKey: "_targets") as? [NSObject] else {
return
}
let targetObjc = targets[0]
let target = targetObjc.value(forKey: "target")
let action = Selector(("handleNavigationTransition:"))
let panGes = UIPanGestureRecognizer(target: target, action: action)
view.addGestureRecognizer(panGes)
}
}