今天和大家一起來閑聊一下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屬性
打印截圖.png
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)
}