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