有时候需要在同一个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=1tapOnceGestureRecognizer.numberOfTapsRequired=1self.addGestureRecognizer(tapOnceGestureRecognizer)
下面是具体的算法:
var pt1:CGPoint?var pt2:CGPoint?var timerTouch:NSTimer?var n:Int = 0//双击func tapOnView(sender:UITapGestureRecognizer){timerTouch?.invalidate()timerTouch = nilif n == 0{pt1 = sender.locationInView(self)}else{pt2 = sender.locationInView(self)}n += 1timerTouch = NSTimer.scheduledTimerWithTimeInterval(NSTimeInterval(0.5), target: self, selector: "touchOnceTick", userInfo: "jimmy", repeats: true)//时间一般设置为0.5秒比较合理if n % 2 == 0{timerTouch?.invalidate()timerTouch = niln = 0var absX = abs(pt2!.x - pt1!.x)var absY = abs(pt2!.y - pt1!.y)var radiusMax:CGFloat = 30if absX < radiusMax && absY < radiusMax{//此处注意的是需要设定一个两次单击的坐标误差,第一次点击和第二次点击的距离不能隔的太远,比如第二次点击在第一次点击的坐标的300像素外,这种情况就算点击的时间再快,也不能视为双击。同时也不能完全将第一次坐标和第二次坐标相等才视为双击,手指点击两次不太可能做到完全相等。println("双击")}}}func touchOnceTick(){timerTouch?.invalidate()timerTouch = nilif n == 1{println("单击")}n = 0