ios - 自定义全局侧滑手势

全局侧滑手势

  • 上代码 -> 直接copy到你自己的 UINavigationController里面就好
import UIKit

class XGNavigationViewController: UINavigationController {

    override func viewDidLoad() {
        super.viewDidLoad()

        getSysPopGesture()
    }
    
    override func pushViewController(_ viewController: UIViewController, animated: Bool) {
        /// 处理 消失Tabbarvc的操作
        self.hidesBottomBarWhenPushed = true
        super.pushViewController(viewController, animated: animated)
    }
    
    /**
      -- 添加 全屏 侧滑手势
     
      思路: 获取系统 侧滑手势 -> 拿到系统侧滑手势对象,拿到系统侧滑手势view -> 拿到系统侧滑手势target和action
             -> 自定义Pan 手势 -> 将拿到的侧滑手势target和action 添加到自定义的pan 手势上 -> 搞定
     */
    
    private func getSysPopGesture() {
        /// 获取系统手势
        guard let sysPopGes = interactivePopGestureRecognizer else { return }
        /// 获取系统手势添加的view
        guard let popGesView = sysPopGes.view else { return }
        
        /// 由于pop手势是系统手势,没有暴露出来,因此使用运行时将其打印出来,然后使用kvc进行添加
        //        var count: UInt32 = 0
        //        let ivars = class_copyIvarList(UIGestureRecognizer.self, &count)!
        //        for i in 0.. 他就只用一个元素
        guard let targetObject = targets?.first else { return }
        //        print(targetObject)
        
        /// 根据 kvc 获取 侧滑手势的 targt 和action
        guard let target = targetObject.value(forKey: "target") else { return }
        //        print(target)  // 可以获取
        
        // MARK: -  这里的action 使用kvc是拿不到的,因此使用下面的Selector 方法
        //        let action = targetObject.value(forKey: "action")
        
        /// 拿到 侧滑手势的 action
        let action = Selector(("handleNavigationTransition:"))
        //        print(action) // 可以获取
        
        /// 手动创建 pan手势,然后添加到系统的侧滑view上 -> 完工
        let pan = UIPanGestureRecognizer.init(target: target, action: action)
        popGesView.addGestureRecognizer(pan)
    }
}

你可能感兴趣的:(ios - 自定义全局侧滑手势)