模拟手指或者鼠标单击和双击

有时候需要在同一个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
    

 

posted @ 2015-03-14 00:30  流火行者  阅读(845)  评论(0编辑  收藏  举报