iOS-右滑返回,利用Runtime添加全屏Pop手势

转载请注明出处:http://blog.csdn.net/qxuewei/article/details/53939129

项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能.
在我们不隐藏 NavigationBar 的前提下,系统会自动替我增加此功能,只是它作用的范围仅仅在屏幕左边有限区域. 我们需要在整个界面添加右滑返回的功能
思路: 利用Runtime 捕获到 系统的全屏Pop手势中所利用的方法,添加到我们需要的View中.

实现思路

我们知道系统的全屏Pop手势为 interactivePopGestureRecognizer 注意此属性仅仅在继承自 UINavigationController 的类里才可用.
我们的思路应该是取到 UIGestureRecognizer 类中储存 target 和 Action 的属性是哪个?

将 interactivePopGestureRecognizer 的target 和 action 赋值给自定义手势即可实现全屏 pop

这里写图片描述

1.首先利用 Runtime 打印某类所有变量以及成员属性

/// RunTime 打印类所有属性(包括变量和成员属性)
    func printAllPropertyWithRuntime(_ anyClass : AnyClass) {
        var count : UInt32 = 0
        // 获取某类的所以变量和成员属性
        guard let ivars = class_copyIvarList(anyClass, &count) else{ return }
        for i in 0..<count {
            // 取出属性
            guard let ivar = ivars[Int(i)] else { return }
            // 获取某属性名称 - 获取到指针
            let propertyNamePointer = ivar_getName(ivar)
            let propertyNameStr : String = String.init(cString: propertyNamePointer!)
            print(propertyNameStr)
        }
    }

在使用时,在适当位置 调用此方法即可:

printAllPropertyWithRuntime(UIGestureRecognizer.self)

我们获取到 UIGestureRecognizer 所以成员变量以及属性列表
这里写图片描述

2.通过 分析 targets 属性最终取到 interactivePopGestureRecognizer 的 target 和 action

/// targets 属性
        guard let targetsValue : NSArray = interactivePopGestureRecognizer?.value(forKey: "_targets") as! NSArray? else { return }
        print(targetsValue)
        /// 拿到 (action=handleNavigationTransition:, target=<_UINavigationInteractiveTransition 0x7fc44860eb50>)
        guard let interactivePopGestureRecognizerTarget : NSObject = targetsValue.lastObject as! NSObject? else { return }
        print(interactivePopGestureRecognizerTarget)
        // 获取需要的 target
        guard let target : Any = interactivePopGestureRecognizerTarget.value(forKey: "target") else { return }
        // 获取需要的 action
        let action : Selector = Selector(("handleNavigationTransition:"))

4.最终 添加到自定义手势即可实现 全屏 pop 功能

完整实现方法:

 /// 添加全屏 pop 手势
    func addFullScreenPopGes() {
        guard let targetsValue : NSArray = interactivePopGestureRecognizer?.value(forKey: "_targets") as! NSArray? else { return }
        guard let interactivePopGestureRecognizerTarget : NSObject = targetsValue.lastObject as! NSObject? else { return }
        // 获取需要的 target
        guard let target : Any = interactivePopGestureRecognizerTarget.value(forKey: "target") else { return }
        // 获取需要的 action
        let action : Selector = Selector(("handleNavigationTransition:"))
        let fullScreenPopPan : UIPanGestureRecognizer = UIPanGestureRecognizer(target: target, action: action)
        self.view.addGestureRecognizer(fullScreenPopPan)
    }

此方法添加到 继承自 UINavigationController 的类中 即可实现全屏 Pop(右滑返回)

完整项目链接:
https://github.com/qxuewei/XWCSDNDemosXWFullScreenPop Demo

猜你喜欢

转载自blog.csdn.net/qiuxuewei2012/article/details/53939129