美文网首页
项目中用到系统右滑返回时解决取消滑动的方法

项目中用到系统右滑返回时解决取消滑动的方法

作者: Neal_f | 来源:发表于2018-06-26 10:27 被阅读0次
       //禁用系统手势,因为跟splitView手势有冲突
          self.interactivePopGestureRecognizer?.isEnabled = false
    //        let target = self.interactivePopGestureRecognizer?.delegate
    //        let pan:UIPanGestureRecognizer = UIPanGestureRecognizer(target: target!, action: Selector(("handleNavigationTransition:")))
    
          pan = UIPanGestureRecognizer(target: self, action: #selector(handleNavigationTransition(_ :)))
          self.view.addGestureRecognizer(pan)
          pan.delegate = self
    

    本来想交换一下系统的handleNavigationTransition,增加状态判断,发现不好做,原因是handleNavigationTransition并不是类的成员方法,获取不到啊,它是target的方法不好获取,放弃了。
    其次有想用 NSInvoke 方法调用handleNavigationTransition 发现swift不好用,就用了oc
    就是target用自己的方法,在自己的手势方法里调用系统的handleNavigationTransition,这样又能使用系统的右滑,又能获取手势的状态了。
    现在可以获得它的状态了,发现并不是想象的那样,没有理解cancle状态:取消手势后才触发。。。。悲剧了
    看来还是要判断手势的位移了

    //MARK: 处理右滑返回取消/失败的问题
        @objc func handleNavigationTransition(_ sender: UIPanGestureRecognizer) {
    
            let target = self.interactivePopGestureRecognizer?.delegate
            let selector = Selector(("handleNavigationTransition:"))
            DealHandle.invoke(target, selector: selector, arguments: [sender])
            print("swizzle state: ---- \(sender.state.rawValue)")
    
            //处理右滑返回到首页时取消了滑动,侧边栏仍然显示的错误
            if sender.state == UIGestureRecognizerState.ended && self.viewControllers.count == 1{
                let position = sender.location(in: sender.view)
                if position.x > 0 && position.x < UIScreen.width/2   {
                    self.splitViewController?.preferredDisplayMode = UISplitViewControllerDisplayMode.primaryHidden
                }
            }
        }
    

    最后贴一下DealHandle.invoke的方法,也就是最简单的调用

    //此方法用来调用系统的方法
    + (void) invoke:(id)target selector:(SEL)selector arguments:(NSArray *)arguments {
    
        //生成selector的函数签名
        //若有另一个selector1与这个selector返回值、参数列表相同,也可以用selector1的函数签名
        NSMethodSignature *signature = [[target class] instanceMethodSignatureForSelector:selector];
        //根据函数签名生成一个NSInvocation对象,NSInvocation对象的生成仅能通过其类方法实现
        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
    
        //设置target、selector,并且target、selector分别占据其参数列表第0个和第1个的位置
        [invocation setTarget:target];
        [invocation setSelector:selector];
    
        id num = arguments[0];
    
        [invocation setArgument:&num atIndex:2];
        //转发此消息
        [invocation invoke];
    }
    

    相关文章

      网友评论

          本文标题:项目中用到系统右滑返回时解决取消滑动的方法

          本文链接:https://www.haomeiwen.com/subject/zpspyftx.html