實現思路
@available(iOS 7.0, *)
open var interactivePopGestureRecognizer: UIGestureRecognizer? { get }
iOS 7.0系統增加了滑動的pop手勢,可惜的是響應范圍太小,只是屏幕的邊緣位置.
我們可以利用runtime
+KVC
來獲取到系統的interactivePopGestureRecognizer
手勢,并將其添加到view
上來實現全屏pop.
- 使用運行時,打印手勢中所有屬性,可以看到其中的
_targets
屬性(具體實現中不需要此段代碼)
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
并打印第一個元素的屬性
guard let targets = interactivePopGestureRecognizer!.value(forKey: "_targets") as? [NSObject] else {
return
}
let targetObjc = targets[0]
print(targetObjc)
上述代碼兩次的打印結果@2x.png
- 最后利用獲取到的
target
和action
創建手勢添加到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)
}
}