全局侧滑手势
- 上代码 -> 直接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)
}
}
网友评论