import UIKit
fileprivate var slideEnabledKey = "slideEnabled"
extension UINavigationController {
/// should slide to back. default is true
var slideEnabled: Bool {
set {
objc_setAssociatedObject(self, &slideEnabledKey, newValue, objc_AssociationPolicy.OBJC_ASSOCIATION_ASSIGN)
}
get {
if let rs = objc_getAssociatedObject(self, &slideEnabledKey) as? Bool {
return rs
}
return true
}
}
}
/// the navigationController enabled full screen slide to back
class FullNavigationController: UINavigationController, UIGestureRecognizerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
fullSlide()
}
func fullSlide() {
guard let recognizer = interactivePopGestureRecognizer else {
return
}
guard let recognizerView = recognizer.view else {
return
}
// use runtime to check the property name
// 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!))
// }
let targets = recognizer.value(forKey: "_targets") as? [NSObject]
guard let targetObjc = targets?.first else {
return
}
guard let target = targetObjc.value(forKey: "target") else {
return
}
let action = Selector(("handleNavigationTransition:"))
let fullRecognizer = UIPanGestureRecognizer()
fullRecognizer.delegate = self
recognizerView.addGestureRecognizer(fullRecognizer)
fullRecognizer.addTarget(target, action: action)
}
override func pushViewController(_ viewController: UIViewController, animated: Bool) {
if viewControllers.count > 0 {
viewController.hidesBottomBarWhenPushed = true
}
super.pushViewController(viewController, animated: animated)
}
func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool {
return slideEnabled && childViewControllers.count > 1
}
}
Swift 导航全屏滑动返回实现
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- - 以下在导航控制器的子控制器中实现的代码//0.1 获取系统target对象let _sysTarget = s...
- 导航控制器的返回按钮设置以及一些细节处理 导航控制器的返回按钮可以通过下面两个属性来设置 根据谁的东西谁管理的原则...
- 作为最基本的知识,我们都知道通过导航控制器push出来子控制器时,系统会默认给导航条的左上角设置一个返回按钮.样式...
- 问题:如果我们在项目中的返回按钮用的是leftBarButtonItem 那么系统自带导航控制器的滑动返回功能失效...