iOS开发笔记--识别单击还是双击

2023-11-13

在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击。解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作;如果有第二次点击,则为双击操作。

检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类中继承来的事件处理方法,即touchesBegan:withEvent:等一系列方法来检测手势;另一个方法是使用手势识别器,即UIGestureRecognizer的各种具体子类。

一.重写事件处理方法

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (id)init {  
  2.     if ((self = [super init])) {  
  3.         self.userInteractionEnabled = YES;  
  4.         self.multipleTouchEnabled = YES;  
  5.         // ...  
  6.     }  
  7.     return self;  
  8. }  
  9. -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
  10. {  
  11.     [NSObject cancelPreviousPerformRequestsWithTarget:self];  
  12.     UITouch *touch = [touches anyObject];  
  13.     CGPoint touchPoint = [touch locationInView:self];  
  14.   
  15.     if (touch.tapCount == 1) {  
  16.         [self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3];  
  17.     }else if(touch.tapCount == 2)  
  18.     {  
  19.         [self handleDoubleTap:[NSValue valueWithCGPoint:touchPoint]];  
  20.     }  
  21. }  
  22.   
  23. -(void)handleSingleTap:(NSValue*)pointValue  
  24. {  
  25.     CGPoint touchPoint = [pointValue CGPointValue];  
  26.     //...  
  27. }  
  28.   
  29. -(void)handleDoubleTap:(NSValue*)pointValue  
  30. {  
  31.     CGPoint touchPoint = [pointValue CGPointValue];  
  32.     //...  
  33. }  

  1. 首先确认定制视图的userInteractionEnabledmultipleTouchEnabled属性都为YES.
  2. touchesEnded:withEvent:方法中,如果是第一次触摸结束,则cancelPreviousPerformRequestsWithTarget:方法不会起作用,因为self未调度任何方法,此时tapCount为1,使用performSelector:withObject:afterDelay:调用单击事件处理方法,在0.3s钟后执行。
    [self performSelector:@selector(handleSingleTap:) withObject:[NSValue valueWithCGPoint:touchPoint] afterDelay:0.3];

    如果这是一个单击操作,则后面0.3钟内不会再有触摸事件,则handleSingleTap:方法执行,这样识别出了单击操作。

  3. 如果这是一个双击操作,则第二次点击在0.3s内触发,在第二次触摸操作的touchesEnded:withEvent:方法中,cancelPreviousPerformRequestsWithTarget:首先会取消之前对handleSingleTap:方法的调度,使之不会执行,然后在调用handleDoubleTap:方法处理双击操作。

二.使用Gesture Recognizer

使用Gesture Recognizer识别就会简单许多,只需添加两个手势识别器,分别检测单击和双击事件,设置必要的属性即可。

[objc]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. - (id)init {  
  2.     if ((self = [super init])) {  
  3.     self.userInteractionEnabled = YES;  
  4.         UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleSingleTap:)];  
  5.         singleTapGesture.numberOfTapsRequired = 1;  
  6.         singleTapGesture.numberOfTouchesRequired  = 1;  
  7.         [self addGestureRecognizer:singleTapGesture];  
  8.   
  9.         UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(handleDoubleTap:)];  
  10.         doubleTapGesture.numberOfTapsRequired = 2;  
  11.         doubleTapGesture.numberOfTouchesRequired = 1;  
  12.         [self addGestureRecognizer:doubleTapGesture];  
  13.   
  14.         [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];  
  15.     }  
  16.     return self;  
  17. }  
  18. -(void)handleSingleTap:(UIGestureRecognizer *)sender{  
  19.     CGPoint touchPoint = [sender locationInView:self];  
  20.     //...  
  21. }  
  22. -(void)handleDoubleTap:(UIGestureRecognizer *)sender{  
  23.     CGPoint touchPoint = [sender locationInView:self];  
  24.     //...  
  25. }  

唯一需要注意的是

  
  
[objc] view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];  

这句话的意思时,只有当doubleTapGesture识别失败的时候(即识别出这不是双击操作),singleTapGesture才能开始识别,同我们一开始讲的是同一个问题。

方法三:[线程]

[plain]  view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. int num = 0;  
  2. -(void)fun1  
  3. {  
  4.     [NSThread sleepForTimeInterval:1];  
  5.     if(num == 1)  
  6.     {  
  7.         NSLog(@"click 1");  
  8.     }  
  9. }  
  10. -(void)fun2  
  11. {  
  12.     [NSThread sleepForTimeInterval:1];  
  13.     if(num == 2)  
  14.     {  
  15.         NSLog(@"click 2");  
  16.     }  
  17. }  
  18. -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
  19. {  
  20.     if([[touches anyObject] tapCount] == 1)  
  21.     {  
  22.         num = 1;  
  23.         NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(fun1) object:nil];  
  24.         [thread start];  
  25.     }  
  26.     else if([[touches anyObject] tapCount] == 2)  
  27.     {  
  28.         num = 2;  
  29.         NSThread * thread = [[NSThread alloc] initWithTarget:self selector:@selector(fun2) object:nil];  
  30.         [thread start];  
  31.     }  
  32. }  




转自:http://www.winddisk.com/2012/10/17/detect_double_tap_single_tap/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS开发笔记--识别单击还是双击 的相关文章

  • 进入前台后刷新数据

    更改默认设置后 我想在AppDelegate中进入前台时刷新myViewController的数据 我所做的是 AppDelegate m void applicationDidFinishLaunching UIApplication a
  • 个人帐户开发者之间的 Apple 开发/分发证书

    我一直在到处寻找有关处理证书的正确答案 想象一下以下帐户 Joe拥有个人 Apple 帐户 但他根本不会编码 他只是发布了该应用程序并将其称为自己的 Bob还有一个个人 Apple 帐户 Bob 是一位编码专家 Joe 付费让他开发他的第一
  • 防止 AlertView 被解雇

    任何人都可以帮助我防止在其按钮单击事件上解雇警报视图吗 我有一个 textview 作为我的alertView 的子视图 如果 textview 值为 nil 我不想关闭它 因为这是一个非常老的问题 但我得到了一个解决方案 并且如果其他开发
  • iOS 循环对象的属性并添加操作

    我有一个具有几个类似属性的类 UISliders 我想添加用户开始和结束使用每个滑块时的操作 每个滑块都将链接到同一个选择器 因此我考虑只是迭代它们 而不是编写 10 个几乎相同的代码块 问题是 最有效的方法是什么 我尝试过这样的事情 在运
  • UIWebView Bug:-[UIWebView cut:]:无法识别的选择器发送到实例

    In the UIWebView 如果包含文本的输入元素具有焦点 并且按下按钮导致输入失去焦点 则随后双击输入以重新获得焦点并从出现的弹出栏中选择 剪切 或 复制 或 粘贴 会导致这UIWebView因错误而崩溃 UIWebView cut
  • 如何反转 CGPath 的点顺序

    我想画一个圆圈 并用它打出字母 为此 我需要顺时针抚摸圆圈 逆时针抚摸字母 这一切都很好 但是当我使用 Core Text 获取字母路径时 我不知道如何从本质上反转该路径 不是镜像或旋转或任何东西 这很简单 我希望点笔画顺序是逆时针的 这实
  • RemoteIO 音频单元播放回调中的 AudioBufferList 内容

    我想 拦截 音频数据传送到 iOS 设备扬声器的过程 我相信这可以使用 RemoteIO 音频单元和回调来完成 在下面的playbackCallback中 ioData实际上包含任何音频数据吗 static OSStatus playbac
  • 仅将 UIImage 移动到另一个 UIImage 内部

    I have an UIImage which is shown in an UIImageView I also have another image in an UIImageView which lays above the firs
  • 我可以更改键盘方向吗?

    例如我用这段代码关闭自动旋转 BOOL shouldAutorotateToInterfaceOrientation UIInterfaceOrientation interfaceOrientation return NO BOOL sh
  • Xcode 无法找到 strip-frameworks.sh 目录

    我最近将 Xcode 更新到版本 7 1 其中包括 Swift 2 1 我安装了 Swift 2 1 没有遇到任何问题 在尝试运行我的项目后 我意识到我需要获取最新版本的 Realm 因为之前的版本不支持 Swift 2 1 我删除了旧框架
  • 在 iOS 上,UIView 的 Frame 属性未在动画内部分配

    在我的 iOS 应用程序中 我尝试执行以下简单的动画 void dismissToolbar NSLog bx f by f bw f bh f toolbar frame origin x toolbar frame origin y t
  • 如何使用MKMapView完成加载委托,可能的“完成显示”委托?

    当用户在选择注释后点击 保存 时 我尝试保存地图视图的缩略图 当用户尚未放大该注释时会出现问题 因此尚未加载关闭缩放级别 这就是用户点击保存后我正在做的事情 将布尔值 saving 设置为 true 居中并放大注释 无动画 当调用mapVi
  • 使用 iPhone 摄像头检测心率 [重复]

    这个问题在这里已经有答案了 可能的重复 使用摄像头检测心率 https stackoverflow com questions 9274027 detecting heart rate using the camera 我正在研究 iOS
  • 如何在 Xcode 4 中在 .h 和 .m 之间切换

    刚刚安装的 Xcode 4 到目前为止一切顺利 除了 Apple 更改了所有键盘快捷键 有人知道如何在 h 和 m 之间切换吗 苹果改变了各种快捷键 但要在标头和实现之间切换 新的快捷键是 You can change it back to
  • 无法将“SDWebImageActivityIndi​​cator”类型的值分配给“ST_SDWebImageIndicator”类型?

    I have multiple flavours targets in my Xcode project I am also using SDWebImage in my app Everything was working fine un
  • 如何防止 RealmSwift 列表中出现重复项?

    如何防止向列表中添加重复项RealmSwift 我有我的User作为领域对象 但真正的数据源是服务器 只是使用领域在本地缓存用户 当我从服务器获取当前用户数据时 我想确保存储在领域中的用户拥有来自服务器的所有播放列表 以及它们的曲目列表等
  • “同时创建 xib 文件”按钮已禁用

    我在创建时遇到这个问题UIView s子类 创建 例如 UIViewControllers or UITableViewCells没关系 为什么会出现这种情况 I create view using cmd N and Xcode Vers
  • 尝试复制文件时出错

    我正在尝试使用 NSFileManager 将临时文件复制到另一个位置 但是它失败并抱怨其中一个文件不存在 Copy temp file NSError error BOOL exists fileManager fileExistsAtP
  • GMSMapView 中的倒多边形

    我必须在我的 iPhone 项目中使用 Google 地图 并且我正在使用 GMSPolygon 来绘制多边形 但是如何填充地图上除多边形内部之外的所有位置 就像下图一样 谢谢 我玩过你的问题 主要思想是用多边形填充整个地球 然后为您的特定
  • 无法将 admob 与 firebase iOS/Android 项目链接

    我有两个帐户 A 和 B A 是在 Firebase 上托管 iOS Android unity 手机游戏的主帐户 B 用于将 admob 集成到 iOS Android 手机游戏中 我在尝试将 admob 分析链接到 Firebase 项

随机推荐

  • Kaldi数据下载很慢

    运行kaldi 的run sh文件时 数据集在openslr上 数据集比较大 例如aishell 总共15G 国内网络情况下下载比较慢 1 修改为国内地址 例如 aishell 默认的run sh里写的是www openslr org re
  • html5 颜色随机变化,每次在HTML5 Canvas的.fillStyle中使用时,将画布图案随机化为不同的颜色(randomizing a canvas pattern to be a diff...

    每次在HTML5 Canvas的 fillStyle中使用时 将画布图案随机化为不同的颜色 randomizing a canvas pattern to be a different color every time it is used
  • 文本数据导入HBASE库找不到类com/google/common/collect/Multimap

    文本数据导入HBASE库找不到类com google common collect Multimap 打算将文本文件导入HBASE库 在运行命令的时候找不到类 com google common collect Multima hadoop
  • PyTorch实战使用Resnet迁移学习

    PyTorch实战使用Resnet迁移学习 项目结构 项目任务 项目代码 网络模型测试 项目结构 数据集存放在flower data文件夹 cat to name json是makejson文件运行生成的 TorchVision文件主要存放
  • springboot 整合 mongodb

    前言 前面通过 5 节的内容 我们学习了 mongodb 的使用 这节我们通过学过的知识运用 springboot 整合 mongodb 搭建一个小项目 项目搭建 springboot 基于 maven 项目搭建的具体过程这里就不再赘述了
  • style标签上的scoped属性

    vue中 在vue文件中的style标签上有一个特殊的属性 scoped 布尔值 作用 该属性的作用是将当前标签下的样式私有化 仅对当前组件起作用 只管当前组件和子组件的最外层 不控制自组件 原理 若是给style标签添加了scoped属性
  • 【python与数据分析】Python与数据分析概述

    目录 一 认识数据分析 1 数据分析的方法论与数据分析方法 一 七何分析法 建立框架 二 演绎树分析法 问题分层 三 PEST分析法 设计环境 四 金字塔原理分析法 建立逻辑 五 4P营销理论分析法 业务指导 六 SWOT分析法 战略竞争
  • 计算机专业大二了啥都没学怎么办

    如果您是计算机专业的大二学生 但是还没有学到很多内容 那么您可以考虑以下几点 加强自学 首先 您可以自学一些基本的计算机知识 如操作系统 算法 数据结构等 寻找资源 您可以寻找一些在线的学习资源 如课程 书籍 视频等 加深自己的知识储备 向
  • C语言函数递归例题讲解(超详细~)

    文章目录 递归题型讲解 例题1 例题2 例题3 递归题型讲解 例题1 根据下面递归函数 调用函数Fun 2 返回值是多少 int Fun int n if n 5 return 2 else return 2 Fun n 1 A 2 B 4
  • fit_transform含义

    fit transform X train 找出X train的均值和 标准差 并应用在X train上 对于X test 直接使用transform方法 此时StandardScaler已经保存了X train的均值和标准差
  • telnet 查看端口是否可访问

    1 首先为什么要写这篇文章 说到为什么还得从DNS服务器说起 我在我的电脑上安装了DNS服务器 但是用网络去访问还怎么都访问都不上去 于是我就打开dos窗口 用ping命令查看是否可以ping 如 ping 125 34 49 211 通
  • FANUC机器人程序实例

    FANUC机器人程序实例 PS 1 2 2 3 7 8 8 9 9 10 10 7为圆弧运动 6 1 3 4 4 5 5 6 6 7 7 6 为直线运动 先画图1 循环3次 等待3秒 再画图2 轨迹如上图所示 10个位置在同一平面 程序 位
  • linux配置SSH

    目录 一 ssh简介 二 ssh配置文件 三 ssh远程登录 四 ssh远程登录原理 4 1 对称加密 4 3非对称加密 一 ssh简介 SSH为建立在应用层上的安全协议 SSH是目前非常可靠 专门为远程登录会话和其它网了服务提供安全性的协
  • 程序员微信名昵称_微信营销手段之昵称命名

    这段时间 我玩微信玩的不少 但是主要还是把精力放在我的QQ空间了 但是我不管在微信上还是扣扣空间我都发现了一个怪现象 就是一直有人用广告名称做昵称 啥是广告名字呢 比如她是卖化妆品的 然后她就把微信昵称改成了某某化妆品销售 代购什么的 这种
  • 史上最全Unity3D游戏开发教程,从入门到精通(含学习路线图)

    Unity现在已经用的很广泛啦 可是却一直没有什么美术向的教程 程序员方面的内容在各个论坛都有讨论 但是美术似乎很弱势啊 明明美术也很需要掌握引擎方面的内容嘛 山谷里的野百合还有春天呢 我们美术也要出教程 很多同学想学习unity却不知道怎
  • react中背景图片和图片引入的方法

    有三种引入背景图片的方法 1 div 2 先import引入图片路径 再用es6语法中的 引用 import bgImage from assets images bgImage webp div 3 用require进行路径引用requi
  • 【图像增强】Debiased Subjective Assessment of Real-World Image Enhancement

    最近学习了CVPR2021的一篇文章 真实世界图像增强的去偏主观质量评价 Debiased Subjective Assessment of Real World Image Enhancement 一 前言 图像质量评价 Image Qu
  • 【Keras】TensorFlow分布式训练

    当我们拥有大量计算资源时 通过使用合适的分布式策略 我们可以充分利用这些计算资源 从而大幅压缩模型训练的时间 针对不同的使用场景 TensorFlow 在 tf distribute Strategy 中为我们提供了若干种分布式策略 使得我
  • R语言相关关系可视化函数梳理

    点击蓝字关注这个神奇的公众号 作者 赵镇宁 R语言中文社区特约作者 当考察多个变量间的相关关系时 通常将多个变量的两两关系以矩阵的形式排列起来 R提供了散点图矩阵 相关矩阵等多种可视化方案 囊括了众多函数 本文对R语言相关关系可视化的函数进
  • iOS开发笔记--识别单击还是双击

    在视图上同时识别单击手势和双击手势的问题在于 当检测到一个单击操作时 无法确定是确实是一个单击操作或者只是双击操作中的第一次点击 解决这个问题的方法就是 在检测到单击时 需要等一段时间等待第二次点击 如果没有第二次点击 则为单击操作 如果有