现在众多APP中都有全屏pop手势
实现这个目前只想到两种方式,如有其他方式请留言告知,相互学习
第一种
根据需求,我们大部分会第一时间想到,在Controller的View中添加手势,然后根据侧滑动作,添加pop当前页面的方法
(但是这种方式实现起来相对麻烦,并且不太好处理)
第二种
根据iOS运行时的特性,把原本左侧边侧滑pop事件,添加到View中,来实现全局pop
(此方式实现较容易,所以选择第二种方式)
具体实现
1.创建自定义UINavigationController
2.获取手势及view
//获取系统手势
guard let systemGes = interactivePopGestureRecognizer else {
return
}
//获取手势添加到view中
guard let gesView = systemGes.view else {
return
}
3.获取属性名称
//获取target/action
//利用运行时机制获取所有属性名称
/*
var count : UInt32 = 0
let ivars = class_copyIvarList(UIGestureRecognizer.self, &count)!
for i in 0..<count{
let ivar = ivars[Int(i)]
let name = ivar_getName(ivar)
print(String(cString : name!))
}
*/
4.根据属性获取target与action
let targets = systemGes.value(forKey: "_targets") as? [NSObject]
guard let tagetObjc = targets?.first else {
return
}
print(tagetObjc)
//取出action
guard let target = tagetObjc.value(forKey: "target") else {
return
}
let action = Selector(("handleNavigationTransition:"))
其中print(tagetObjc)
是
(action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7f92e3f16b20>)
5.创建自己的手势
let panGes = UIPanGestureRecognizer()
gesView.addGestureRecognizer(panGes)
panGes.addTarget(target, action: action)
这样就完成全局的pop手势了