iOS 同一个View识别单击和双击手势

LogicFlow 学习笔记——3. LogicFlow 基础 节点 Node 本篇博客详细介绍了LogicFlow框架中基础和自定义节点的使用方法。首先解释了基础节点类型,包括矩形、圆形等SVG形状,并展示如何通过继承和重写来创建符合特定业务需求的自定义节点。然后详细讲述了自定义节点的`model`和`view`,说明了如何通过MVVM模式来控制节点的外观和行为。最后,通过多个代码示例展示了如何在项目中实现这些自定义节点。 阅读详情

本文主要介绍两种方法:

一:重写事件处理方法。

二:使用Gesture Recognizer。

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

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

一.重写事件处理方法

- (id)init {

    if ((self = [superinit])) {

        self.userInteractionEnabled = YES;

        self.multipleTouchEnabled = YES;

        // ...

    }

    return self;

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event

{

    [NSObjectcancelPreviousPerformRequestsWithTarget:self];

    UITouch *touch = [touches anyObject];

    CGPoint touchPoint = [touch locationInView:self];

    

    if (touch.tapCount ==1) {

        [selfperformSelector:@selector(handleSingleTap:)withObject:[NSValuevalueWithCGPoint:touchPoint]afterDelay:0.3];

    }else if(touch.tapCount ==2)

    {

        [self handleDoubleTap:[NSValuevalueWithCGPoint:touchPoint]];

    }

}

-(void)handleSingleTap:(NSValue*)pointValue

{

    CGPoint touchPoint = [pointValue CGPointValue];

    //...

}

-(void)handleDoubleTap:(NSValue*)pointValue

{

    CGPoint touchPoint = [pointValue CGPointValue];

    //...

}

  1. 首先确认定制视图的userInteractionEnabled和multipleTouchEnabled属性都为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识别就会简单许多,只需添加两个手势识别器,分别检测单击和双击事件,设置必要的属性即可。

- (id)init {

    if ((self = [superinit])) {

        self.userInteractionEnabled = YES;

        UITapGestureRecognizer *singleTapGesture = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleSingleTap:)];

        singleTapGesture.numberOfTapsRequired =1;

        singleTapGesture.numberOfTouchesRequired  =1;

        [self addGestureRecognizer:singleTapGesture];

        

        UITapGestureRecognizer *doubleTapGesture = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(handleDoubleTap:)];

        doubleTapGesture.numberOfTapsRequired =2;

        doubleTapGesture.numberOfTouchesRequired =1;

        [self addGestureRecognizer:doubleTapGesture];

        

        [singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];

    }

    return self;

}

-(void)handleSingleTap:(UIGestureRecognizer *)sender{

    CGPoint touchPoint = [sender locationInView:self];

    //...

}

-(void)handleDoubleTap:(UIGestureRecognizer *)sender{

    CGPoint touchPoint = [sender locationInView:self];

    //...  

}


唯一需要注意的地方就是:

[singleTapGesture requireGestureRecognizerToFail:doubleTapGesture];  

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

iOS - 同一个View识别单击和双击手势 需求:在同一个cell上响应单击和双击方法,分别进入不同方法。在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击。解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作;如果有第二次点击,则为双击操作。检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类... 阅读详情

相关推荐

iOS手势识别:识别原理和自定义手势识别

1,手势识别器简介在iOS中由于手势识别器的存在,我们可以非常容易的识别出用户的交互手势。 系统提供的手势识别器如下: UITapGestureRecognizer (点一下) UIPinchGestureRecognizer(二指往內或往外拨动,平时经常用到的缩放) UIRotationGestureRecognizer(旋转) UISwipeGestureRecognizer(滑动,快速移动)

hejunm的技术分享 3051

手势操作---识别单击还是双击

在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击。解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作;如果有第二次点击,则为双击操作。 检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类中继承来的事件处理方法,即touchesBegan:w

iOS界@迷糊小书童 2970

鼠标单击变双击测试器

使用这个鼠标单击变双击测试器, 可以简单的测试一下您的鼠标是否需要更换了

win32中如何区别“鼠标单击”和 “鼠标双击”

今天在编写一个win32的程序时,遇到了一个问题,那就是在我响应鼠标双击这个事件时,先响应了鼠标单击这个事件。于是下决心解决这个问题。后来才明白,鼠标双击是由两次鼠标的单击组成的,只不过windows通过判断两次鼠标单击的时间,如果两次鼠标单击在200ms之内,则说明是鼠标双击事件,如果超过了200ms,则说明是鼠标的两次单机事件。那么如何在响应鼠标双击的同时不响应鼠标单击事件呢?也就是过滤掉鼠标

bestpool的专栏 7433

QWEN 2.5模型结构解析与代码解读

对Qwen2.5大模型的代码进行研究

4364

14、OpenClaw(龙虾助手)Skill 开发完整规范(2026最新版)

OpenClaw Skill 开发指南摘要: Skill 是 OpenClaw AI 助手的核心扩展机制,支持声明式(SKILL.md)和原生代码(JS/TS/Python)两种开发模式。声明式 Skill 通过 Markdown 定义触发条件和执行流程,适合简单业务;原生代码 Skill 提供完整编程能力,适合复杂场景。开发需遵循标准化项目结构,包含 SKILL.md(元数据)、manifest.json(权限声明)等文件,并严格处理错误和多系统适配。新版要求原生 Skill 必须声明文件、网络等权限,确

欢迎光临~知1而N的博客 1239

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

在视图上同时识别单击手势和双击手势的问题在于,当检测到一个单击操作时,无法确定是确实是一个单击操作或者只是双击操作中的第一次点击。解决这个问题的方法就是:在检测到单击时,需要等一段时间等待第二次点击,如果没有第二次点击,则为单击操作;如果有第二次点击,则为双击操作。 检测手势有两种方法,一种是定制子视图,重写视图从UIResponder类中继承来的事件处理方法,即touchesBegan:w

hopedark的专栏 1万+

揭秘N531:这颗不到2毛钱的国产栅极驱动器,如何成为功率开关的“全能搭档”?

本文深入解析了国产栅极驱动器N531如何成为功率开关的“全能搭档”。针对MOSFET和IGBT等电压驱动器件在实际应用中需要大电流实现快速开关的核心痛点,N531凭借±500mA的强劲驱动能力、宽电压供电及高兼容性,有效降低开关损耗,提升系统效率与可靠性。文章通过实战案例与设计指南,阐述了这颗高性价比芯片在简化设计、降低成本方面的显著优势。

z5a6b的博客 621

(转)iOS 同一个View识别单击和双击手势

https://blog.youkuaiyun.com/cocochenqiuyue/article/details/70228562 https://blog.youkuaiyun.com/stuazt/article/details/47443315 https://blog.youkuaiyun.com/qq_28934205/article/details/49449655 https://blog.youkuaiyun.com/...

winter's blogs 329

Android HCE实战:手把手教你用Kotlin实现NFC公交卡模拟(含完整APDU指令解析)

本文是一份Android HCE实战指南,详细讲解如何使用Kotlin实现NFC公交卡模拟。内容涵盖HCE服务搭建、APDU指令(如SELECT AID、GET PROCESSING OPTIONS)的完整解析与响应逻辑,并提供读卡器端测试代码,帮助开发者深入理解基于主机的卡模拟技术。

qsc901234567的博客 1117

手机银行应用架构设计

网上银行借助互联网、移动通信网络等技术向客户提供金融服务,易受到通讯层面的安全威胁,金融机构应从通讯协议、安全认证、通信链路安全等层面,采取措施有效应对相关风险。网上银行系统服务器端提供网上银行应用服务和核心业务处理功能,金融机构应充分利用物理环境、通信网络、计算环境等领域的防护技术,在攻击者和受保护的资源间建立多道严密的安全防线。 网上银行除直接向用户提供金融服务外,也可能与外部机构开展业务合作。在网上银行系统设计、开发、部署和运营过程中,应充分考虑外部机构的系统可能存在的安全风险,并针对各类风险进行有效

银行信息系统应用架构详解 4830

ios 单击和双击手势

#import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad {     [super viewDidLoad];     // Do any additional setup after l

春风得意,马蹄仍急;少年豪情,一笑难回。 3170

safetymonitorapi

Summary of SA8653 Safety Monitor API Introduction This document details Safety Monitor APIs for the SA8653 QNNX platform, covering dual interfaces of APSS and SAIL. It defines core data structures and enumerations for subsystems, fault severity and health

qq_39257814的博客 1588

[转载]iOS防止单击、双击手势冲突(OC)

原文链接:http://blog.youkuaiyun.com/likendsl/article/details/7554150 ios的手势操作之UIGestureRecognizer浅析 手势识别是具有互斥的原则的,比如单击和双击,如果它识别出一种手势,其后的手势将不被识别。所以对于关联手势,要做特殊处理以帮助程序甄别,应该把当前手势归结到哪一类手势里面。 比如,单击和双击并存时,如果

u011460961的博客 3262

华为OD机试真题 新系统 - 8位LED控制器 (Java/Py/C/C++/Js/Go)

本文整理华为 OD 机试新系统机考真题库,涵盖高频考点精析与完整题目内容,提供 C 语言、Java、C++、Python、Go、JavaScript 多语言源码实现,搭配详细解题思路讲解,并支持在线 OJ 刷题练习,助力高效备考华为 OD 机试新系统。

算法大师! 1976

白皮精读:70页 2025 基于数据空间的金融数据可信流通研究报告【附全文阅读】

金融数据可信流通面临法规、技术与商业模式的挑战。报告分析国内外发展现状,提出基于数据空间的可信流通框架,包含典型场景、技术方案与流通模式。实践案例显示,隐私计算、区块链等技术可提升风控效率与合规性。建议完善数据分类分级、统一技术标准并推动行业试点,以释放数据要素价值,促进数字经济发展。

cdfunlove的博客 849

UIVIew单击、双击手势

- (void)viewDidLoad    {       // 单击的 Recognizer       UITapGestureRecognizer* singleRecognizer;       singleRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:selfaction:@selector(Single

jmulxg的专栏 2843

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

ios的手势操作之UIGestureRecognizer浅析

一、概述 iPhone中处理触摸屏的操作,在3.2之前是主要使用的是由UIResponder而来的如下4种方式:  - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  - (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event  -

程序人生 13万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

iOS 单击手势和双击手势共存问题

- (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRect

majiakun1的专栏 2万+

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

iOS常见手势总结-单击、双击、捏合、旋转、移动、清扫、长按

- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. self.view.backgroundColor = [UIColor purpleColor]; _imageView = [[UIImageView alloc]i...

CC的博客 884

iOS中单双击,滑动和捏合手势的实现原理

在iOS中,虽然系统已经封装好了单击,双击,滑动,捏合手势的方法,但这次简单讨论一下这些手势的内部实现原理 1,创建视图,所有的手势都在该视图上有效 - (void)viewDidLoad { [super viewDidLoad]; _view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 90, 375, 200

小郭的博客 1368

iOS 单击手势和双击手势冲突问题

- (void)viewDidLoad {     [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib.     UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMak

huanghaiyan_123的专栏 995

Swift - 单击手势与双击手势(多击手势)共存响应方法

有些需求需要我们区分开单次点击和多次点击事件, 其实这很简单,只要使用 require(toFail:) 方法,设置响应点击次数就可以了,demo如下:

LJ·杨的博客 4889

iOS--手势控制的使用:单击、双击、长按、滑动、托移、捏合、晃动。。

// 手势识别是具有互斥的原则的,比如单击和双击,如果它识别出一种手势,其后的手势将不被识别          // 添加单击的手势     UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizeralloc] init];     tapGestureRecognizer.numberO

mag1c1an的黑魔法书 1075
上一篇: iOS xib创建UIScrollView不滑动问题解决
下一篇: iOS 图片捏合放大缩小 点击放大缩小
Dancer2015
博客等级 码龄12年 17粉丝 54原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值