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#中文字符串与byte数组互相转化
    c#的中英文混合字符串截取 public static string SubString(string inputString, int byteLength)
    c#的中英文混合字符串截取指定长度,startidx从0开始
    //字符是否为汉字
    //获得字节长度
    C# 截取中英文混合字符串分行显示宽度相同
    C#截取中英文混合字符串分行显示
    C#截取指定长度中英文字符串方法 (修改)
    截取字符串的长度(中英文)
    canvas贪吃蛇游戏
  • 原文地址:https://www.cnblogs.com/baitongtong/p/7263642.html
Copyright © 2011-2022 走看看