zoukankan      html  css  js  c++  java
  • 模拟手指或者鼠标单击和双击

    有时候需要在同一个UI上实现双击和单击的操作,IOS的手势识别中自带有单击双击甚至三击四击。。。。

    具体是这样的:

       var tapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapGesture:")
            tapGestureRecognizer.numberOfTouchesRequired=2//每次点击要求有两个点
            tapGestureRecognizer.numberOfTapsRequired=3//需要连续点击三次才能触发

    但是上面只能实现单一的在同一个UI上的操作。即要么实现单击,要么实现双击。

    所以只能用计时器模拟单击双击的操作。

    首先定义一个手指的单击操作:

          var tapOnceGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapOnView:")
            tapOnceGestureRecognizer.numberOfTouchesRequired=1
            tapOnceGestureRecognizer.numberOfTapsRequired=1
            self.addGestureRecognizer(tapOnceGestureRecognizer)

    下面是具体的算法: 

        var pt1:CGPoint?
        var pt2:CGPoint?
        var timerTouch:NSTimer?
        var n:Int = 0
        //双击
        func tapOnView(sender:UITapGestureRecognizer){
            timerTouch?.invalidate()
            timerTouch = nil
            if n == 0{
                pt1 = sender.locationInView(self)
            }else{
                pt2 = sender.locationInView(self)
            }
            n += 1
            timerTouch = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.5), target: self, selector: "touchOnceTick", userInfo: "jimmy", repeats: true)//时间一般设置为0.5秒比较合理
            if n % 2 == 0{
                timerTouch?.invalidate()
                timerTouch = nil
                n = 0
                var absX = abs(pt2!.x - pt1!.x)
                var absY = abs(pt2!.y - pt1!.y)
                var radiusMax:CGFloat = 30
                if absX < radiusMax && absY < radiusMax{//此处注意的是需要设定一个两次单击的坐标误差,第一次点击和第二次点击的距离不能隔的太远,比如第二次点击在第一次点击的坐标的300像素外,这种情况就算点击的时间再快,也不能视为双击。同时也不能完全将第一次坐标和第二次坐标相等才视为双击,手指点击两次不太可能做到完全相等。
                    
              println("双击")
    
    
                }
            }
        }
        func touchOnceTick(){
            timerTouch?.invalidate()
            timerTouch = nil
            if n == 1{
          
            println("单击")
           }
            n = 0
        
    
  • 相关阅读:
    Spring Boot2 系列教程(十三)Spring Boot 中的全局异常处理
    Spring Boot2 系列教程(十二)@ControllerAdvice 的三种使用场景
    Spring Boot2 系列教程(十一)Spring Boot 中的静态资源配置
    Spring Boot2 系列教程(十)Spring Boot 整合 Freemarker
    Python pass 语句
    Python continue 语句
    Python break 语句
    Python 循环嵌套
    Python for 循环语句
    小程序开发中的六大问题难点
  • 原文地址:https://www.cnblogs.com/JimmyBright/p/4336346.html
Copyright © 2011-2022 走看看