触摸事件,手势识别(UITouch,UIGestureRecognizer)
触摸发生时,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)的更多相关文章
- iOS基础 - 触摸事件&手势识别
================================================================== 一.触摸事件&手势识别 1> 4个触摸事件,针对视图 ...
- 阶段性总结⓵触摸事件&手势识别⓶Quartz2D绘图⓷CALayer图层⓸CAAnimation⓹UIDynamic UI动力学⓺KVC&KVO
知识点复习 1. 触摸事件&手势识别 1> 4个触摸事件,针对视图的 2> 6个手势识别(除了用代码添加,也可以用Storyboard添加) 附加在某一个特定视图上的, ...
- iOS开发——UI进阶篇(十二)事件处理,触摸事件,UITouch,UIEvent,响应者链条,手势识别
触摸事件 在用户使用app过程中,会产生各种各样的事件 一.iOS中的事件可以分为3大类型 触摸事件加速计事件远程控制事件 响应者对象在iOS中不是任何对象都能处理事件,只有继承了UIResponde ...
- iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 概览 iPhone的成功很大一部分得益于它多点触摸的强大功能,乔布斯让人们认识到手机其实是可以不用按键和手写笔直接操作的,这不愧为一项伟大的设计.今天我们就针对iOS的触摸事 ...
- IOS触摸事件和手势识别
IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan: ...
- 转发:iOS开发系列--触摸事件、手势识别、摇晃事件、耳机线控
-- iOS事件全面解析 转载来自崔江涛(KenshinCui) 链接:http://www.cnblogs.com/kenshincui/p/3950646.html 概览 iPhone的成功很大一 ...
- ios开发——实用技术OC-Swift篇&触摸与手势识别
iOS开发学习之触摸事件和手势识别 iOS的输入事件 触摸事件 手势识别 手机摇晃 一.iOS的输入事件 触摸事件(滑动.点击) 运动事件(摇一摇.手机倾斜.行走),不需要人为参与的 远程控制 ...
- iOS_触摸事件与手势识别
目 录: 一.触摸事件 1.1iOS的输入事件 1.2 触摸事件的处理 1.3 UITouch类中包含五个属性 1.4 UITouch类中包含两个成员函数 1.5响应者链 二.手势识别 2.1使用手 ...
- 【iOS系列】-触摸事件与手势识别
[iOS系列]-触摸事件与手势识别 第一:触摸事件 一根手指触摸屏幕时,会创建一个与手指相关联的UITouch对象 UIEvent:称为事件对象,记录事件产生的时刻和类型 两根手指同时触摸一个view ...
随机推荐
- 学习php
一.php是什么? 1.PHP:Hypertext Preprocessor(超文本预处理语言),是一种开源脚本语言. 2.PHP是脚本语言 3.PHP最流行的网站开发语言 4.PHP官网:http: ...
- R-shiny服务器安装及配置
R的shiny 服务器管理-入门http://www.bio-info-trainee.com/1683.html sudo systemctl start shiny-serversudo syst ...
- servlet_1
HttpServlet超类在java构建路径中没有找到 https://jingyan.baidu.com/article/6c67b1d69a37a02787bb1ee2.html ======== ...
- 我发起并创立了一个 Javascript 前端库 开源项目 jWebForm
在线演示地址: ( 在线演示 云平台 由 Kooboo 提供 https://www.kooboo.com/ ) 按钮: http://iwebform.kgeking.kooboo.si ...
- css格式
<head> <style>body {color:#000000;font-weight:normal;} .c1{ color: #fff; background-colo ...
- DLL简单分析与调用方法
最近为了分析一个没有代码的DLL有哪些函数,找了各种方法. 把结果分享一下:三个方法都没法得到函数的参数,有点让我失望. DLL Export Viewer NikPEViewer Dumpbin 配 ...
- 【CentOS】设置定时执行任务
1.Crond服务启动状态确认 service crond status crond (pid ) を実行中... 2.追加新的执行任务 crontab -e #Ansible: dnsmasq fo ...
- Centos 7 64位 minimal 最小化安装的系统中静默安装oracle 11g r2
1:安装好centos 7 操作系统: 虚拟机安装centos 7,在vmware中一步步来就可以成功. 2:安装vim 最小化安装的系统只有vi编辑器,这里装一下vim,个人习惯,可以不安装, 那么 ...
- @RequestParam、@ReqeustBody、@ReponseBody认识
简介: @RequestParam和@RequestBody均是处理request body部分的注解,都用于获取请求部分的参数. @ResponseBody是用于响应部分的注解 1. @Reques ...
- NodeJs Fs模块
和前面的Http.Url模块一样,Fs模块也是node的核心模块之一,主要用于对系统文件及目录进行读写操作. 基本方法 fs.stat fs.stat可以用来判断是文件还是目录:stats.isFil ...