今天和大家一起来闲聊一下Swift全屏pop的实现,有疏忽的地方,还望各位不吝赐教。
一、全屏Pop的实现方式
- 第三方 :FDFullscreenPopGesture,这里就不在赘述了。
- KVC实现 :因为苹果本身就已经带有左边缘的Pop,所以我们要做的就是想办法把系统的手势给取出来,加到当前的View上。
二、KVC实现代码
1、先使用RunTime打印系统手势中所有的属性,找到taget和action就好办了。
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.init(cString: nameP)
log("\(name)")
}
-
注意到系统手势中_targets属性
2、通过KVC进行添加手势的操作
- 首先先自定义一个UINavigationController,重写系统viewDidLoad()方法
override func viewDidLoad() {
super.viewDidLoad()
// 判断_targets中是否有值
guard let targets = interactivePopGestureRecognizer!.value(forKey: "_targets") as? [NSObject] else {
return
}
// 去除targets中第一个元素,这里大家可以打印一下看一看targets和第一个元素中的数据
let targetObj = targets[0]
// 通过KVC拿到target
let target = targetObj.value(forKey: "target")
// 通过字典无法拿到action,这里通过Selector方法包装action
let action = Selector.init(("handleNavigationTransition:"))
// 创建UIPanGestureRecognizer(平移手势识别器)
let panGes = UIPanGestureRecognizer.init(target: target, action: action)
// 将创建的手势加到当前的View上
view.addGestureRecognizer(panGes)
}
- 小福利:这里把hidesBottomBarWhenPushed也封装到自定义的UINavigationController,以后Push想要隐藏Tabbar也不用再写.hidesBottomBarWhenPushed了
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
// 必须先隐藏tabBar,再调super
viewController.hidesBottomBarWhenPushed = true
super.pushViewController(viewController, animated: true)
}