Swift - 全屏添加pop手势

2017-07-26  本文已影响0人  Soullamet

现在众多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手势了

上一篇 下一篇

猜你喜欢

热点阅读