美文网首页工作生活
ios - 自定义全局侧滑手势

ios - 自定义全局侧滑手势

作者: best_su | 来源:发表于2019-06-30 13:57 被阅读0次

全局侧滑手势

  • 上代码 -> 直接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..<count {
        //            let ivar = ivars[Int(i)]
        //            let value = ivar_getName(ivar)
        //            print(String(cString: value!))
        //        }
        //        拿到 _targets
        
        let targets = sysPopGes.value(forKey: "_targets") as? [NSObject]
        // print(targets) // 他是一个数组
        
        /// 拿到数组中的第一个元素 --> 他就只用一个元素
        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 - 自定义全局侧滑手势

    本文链接:https://www.haomeiwen.com/subject/iccbcctx.html