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

摘要:
有时您需要双击并单击同一个UI。IOS手势识别附带双击,甚至三次单击和四次单击……因此,您只能使用计时器模拟双击操作。同时,在被认为是双击之前,不可能将第一个坐标与第二个坐标完全等同。用手指双击不太可能完全等于无效()timerTouch=nilfn==1{println}n=0

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

免责声明:文章转载自《模拟手指或者鼠标单击和双击》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Python递归 — — 二分查找、斐波那契数列、三级菜单jeesite在eclipse中部署下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Cobbler自动化部署

一、Cobbler服务的介绍 Cobbler是一个免费开源系统安装部署软件,用于自动化网络安装操作系统 Cobbler集成了DNS DHCP软件包更新,以及配置管理,方便操作系统安装自动化 Cobbler支持命令行管理,WEB界面管理,同时提供API接口便于二次开发 Cobbler客户端token支持虚拟机安装和操作系统重新安装,使重装系统更便捷 1.1 ...

瀑布流的三种实现方式(原生js+jquery+css3)

前言 项目需求要弄个瀑布流的页面,用的是waterfall这个插件,感觉还是可以的,项目赶就没自己的动手写。最近闲来没事,就自己写个。大致思路理清楚,还是挺好实现的... 原生javascript版 <!DOCTYPE html> <html lang="en"> <head> <meta charset=...

.NET CORE 2.1 导出excel文件的两种方法

最近在做 MVC 项目的时候遇到项目的导出,下面总结下两种导出到excel 的方法 第一种方法:将文件写到本地,然后返回这个File 或者返回这个 File 的绝对地址 其中 _hostingEnvironment 可以在全局读取的配置文件的工具类 Globals 中配置 直接上代码: privateIHostingEnvironment _hosting...

高性能javascript笔记:浏览器中DOM操作的性能优化(二)

  关于浏览器中DOM操作的性能优化,在上一篇博文《浏览器中DOM操作的性能优化(一)》中已经阐述了访问和修改DOM元素对性能的影响及优化方案。这次我们就来说一下关于页面的重绘和重排版问题。   当浏览器下载完所有的HTML标签和其组件(Javascript,css,图片等)后,浏览器就会解析文件并创建两个内部数据结构:  1、DOM Tree :表示页面...

AdminLte 框架 和 requireJs 整合的问题

最近在 做一个基于 adminLte 框架的项目,在我将 require 引进项目之后,框架中的 adminlte.js 中搞的左侧边栏 就不起作用了。 刚开始以为是 各位不符合 requireJs 的书写格式,随后将 adminLTe。js 的 源码 修改为 define() 的格式,然而 当然还是没有效果。 define(['jquery'],func...

Nodejs与ES6系列1:变量声明

1、声明变量 在JS当中一个变量的作用域(scope)是程序中定义这个变量的区域。变量分为两类,全局(global)的和局部的。其中全局变量的作用域是全局性的,即在JavaScript代码中,它处处都有定义。而在函数之内声明的变量,就只在函数体内部有定义。它们是局部变量,作用域是局部性的。函数的参数也是局部变量,它们只在函数体内部有定义。 1.1 var变...