zoukankan      html  css  js  c++  java
  • iOS-右滑返回,利用Runtime添加全屏Pop手势

    项目中经常会遇到类似需求,需要在某控制器增加全屏右滑返回功能. 
    在我们不隐藏 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(右滑返回)

  • 相关阅读:
    c# applibrary实现一个Sheet表中存放多张DataTable数据
    c#实现远程操作svn
    bat中rar压缩命令
    GitHub的使用之新建与更新代码
    工作笔记3
    jstat查看JVM GC情况
    sentinel 控制台接入
    Spring注解方式配置Redis
    mysql,utf8,utf8mb4
    Dubbo启动过程(Spring方式)详解
  • 原文地址:https://www.cnblogs.com/baitongtong/p/7263642.html
Copyright © 2011-2022 走看看