利用runtime獲取系統自帶的pop手勢,實現全屏pop

實現思路

@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
  • 最后利用獲取到的targetaction創建手勢添加到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) 
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容