触摸发生时,UIWindow会有一个队列来存放所有的触摸事件,然后再把这些事件发送给对应的hit-test view,hit-test view会通过touch的四个函数来接收这些事件。

四个函数分别为:(began,move, end, cancel)

//touches method

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

[super touchesBegan:touches withEvent:event];

}

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

[super touchesMoved:touches withEvent:event];

}

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

[super touchesEnded:touches withEvent:event];

}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {

NSLog(@"%s", __func__);

[super touchesCancelled:touches withEvent:event];

}

手势识别器同样有touch的四个函数,但是手势识别器本身并不继承自UIResponder,本身并不在响应链里,只有手势识别器对应的view在响应链中的时候手势识别器才会监听touch事件,并根据自己的touch函数识别手势,然后触发相应的回调函数。本质来说,hit-test view触摸事件的回调跟手势识别器是两个独立的过程,互不干涉,手势识别器先开始接收touch事件。但是手势识别中定义了三个属性,能够影响hit-test view触摸事件的调用过程,这三个属性如下所示:

gesture.cancelsTouchesInView

当值为YES时(默认值),表示手势识别成功后触摸事件取消掉,即识别成功后hitTest-View会调用touchesCancelled函数。

当值为NO时,触摸事件会正常起作用,会正常收到touchesEnded消息。

gesture.delaysTouchesBegan  = NO;

当值为NO时(默认值),触摸事件和手势识别的过程同时进行,当然先会发送触摸事件,然后当手势识别成功时,触摸事件会被取消掉,即识别成功后hitTest-View会调用touchesCancelled函数。

当值为YES时,手势识别器先接收touch事件进行手势识别,识别过程中hit-test view的触摸事件会先被UIWindow hold住,当手势识别成功时hit-test view的触摸事件不会调用,当手势识别失败时才开始调用touchesBegan函数。

gesture.delaysTouchesEnded = YES;

此属性差别比较小。

当值为YES时(默认值),当手势识别失败时会延迟(约0.15ms)调用touchesEnded函数。

当值为NO时,当手势识别失败时会立即调用touchesEnded函数。

delaysTouchesBegan、delaysTouchesEnded这两个属性决定是否在手势识别过程中向hit-test view发送触摸事件。

总结:触摸事件与手势识别是两个相对独立的过程,但是手势识别可以通过一些属性来影响触摸事件的调用,一般来说手势识别器的回调函数会比hit-test view的触摸事件的晚一些,因为手势识别器只有在手势识别出来之后才会触发回调函数(默认情况下只有一个手势识别器能够响应),但是手势识别器接收touch事件的时机比hit-test view早。

触摸事件过程:

触摸开始,找到first responder同时找到响应链,当响应链上没有手势识别器时,触摸事件通过first responder的响应链开始传递,如果响应链上有手势识别器,那么手势识别器先接收事件,然后再根据手势识别器的三个属性来决定是否同时将触摸事件传给first responder。

手势识别器原理:

手势识别器根据自身的四个touch函数来识别手势,例如长按、滑动等,手势识别器并不继承自UIResponder,因此它的四个touch函数不是UIResponder中的函数,而是UIResponder中这四个函数的镜像(说白了就是从UIResponder的头文件中复制粘贴过来的)。

由此可以推测UIButton的“按下”事件等也是根据四个Touch函数来实现的,因为UIButton继承自UIResponder,本身自带四个Touch函数。(经实验发现UIButton设置为enable时,在接收到触摸事件之后不会继续向上传递触摸事件,设置为disable时会向上传递触摸事件,但是加在UIButton上的tap手势不会起作用)

参考资料:

https://blog.csdn.net/petyou123/article/details/50893823

触摸事件,手势识别(UITouch,UIGestureRecognizer)的更多相关文章

  1. iOS基础 - 触摸事件&手势识别

    ================================================================== 一.触摸事件&手势识别 1> 4个触摸事件,针对视图 ...

  2. 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO

    知识点复习   1. 触摸事件&手势识别   1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加)   附加在某一个特定视图上的, ...

  3. iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别

    触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...

  4. iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...

  5. IOS触摸事件和手势识别

    IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan: ...

  6. 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控

    -- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...

  7. ios开发——实用技术OC-Swift篇&触摸与手势识别

    iOS开发学习之触摸事件和手势识别   iOS的输入事件 触摸事件 手势识别 手机摇晃 一.iOS的输入事件   触摸事件(滑动.点击) 运动事件(摇一摇.手机倾斜.行走),不需要人为参与的 远程控制 ...

  8. iOS_触摸事件与手势识别

    目  录: 一.触摸事件 1.1iOS的输入事件 1.2 触摸事件的处理 1.3 UITouch类中包含五个属性 1.4 UITouch类中包含两个成员函数 1.5响应者链 二.手势识别 2.1使用手 ...

  9. 【iOS系列】-触摸事件与手势识别

    [iOS系列]-触摸事件与手势识别 第一:触摸事件 一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 UIEvent:称为事件对象,记录事件产生的时刻和类型 两根手指同时触摸一个view ...

随机推荐

  1. Java_04循环结构

    1.while 循环结构 格式: while(循环条件){ } 关键字 while 后的小括号中的内容是循环条件.循环条件是一个表达式,值为布尔类型. { }大括号中的语句统称为循环操作,又称为循环体 ...

  2. 跳台阶(JAVA)

    跳台阶 题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 思路:典型的动态规划问题,动态规划问题最关键的是把事件中的各种情形抽象为状态,然后找到前后 ...

  3. 我提出了一个 Lean Html 5 的 概念 和 标准

    提出 Lean Html 5 是因为 Html 可以作为 一个 应用程序 开发 的 标准 和 平台, 应用程序 包括 Web 程序 , 本地程序 , 桌面程序 , 嵌入式程序 , 串口通信 等 . L ...

  4. ningx.conf location

    server { listen ; server_name localhost; location /dirName { alias "C:/Users/VALEB/Downloads/in ...

  5. Oracle 动态SQL 注意细节 ORA-00911: 无效字符

    随笔 - 46  文章 - 92  评论 - 5   lv_sql:='  insert into ETL_SUCESS_AMOUNT  select SEQ_OS_ETL_AMOUNTID.NEXT ...

  6. DSP 运行时间计算函数--_itoll(TSCH,TSCL);

    DSP OMAP 程序耗时测定 CPU周期 两种方法 利用TSCL和TSCH来计算时钟周期,这两天看了一下如何他们 DSP开发,测量某个函数或某段代码的cycles消耗是经常要做的 事情,常用的pro ...

  7. python io-os

    #IO - os import os; #文件改名 #os.rename('io.txt','newio.txt'); #删除文件 #os.remove('io2.txt'); #创建文件夹(目录) ...

  8. 去freessl.org申请免费ssl服务器证书

    去freessl.org申请免费ssl服务器证书 来源: 本文链接 来自osnosn的博客 写于: 2019-03-30. 想搞个自签名证书,可以参考这篇: 用openssl为WEB服务器生成证书(自 ...

  9. POI 生成、导出Excel(包含多个sheet)带 图片

    1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar ...

  10. 解决spring-boot配置文件使用加密方式保存敏感数据启动报错No decryption for FailsafeTextEncryptor. Did you configure the keystore correctly

    spring-boot配置文件使用加密方式保存敏感数据 application.yml spring: datasource: username: dbuser password: '{cipher} ...