iOS触摸事件总结

一、关于事件传递一些基础知识

1、UIView类是UIResponder的一个子类,因此能够接收用户和视图内容交互 时产生的触摸事件。触摸事件从发生触摸的视图开始,沿着响应者链进行传 递,直到最后被处理。

视图本身就是响应者,是响应者链的参与者,因此可以 收到所有关联子视图派发给它们的触摸事件。

2、在缺省情况下,视图每次只响应一个触摸动作。如果用户将第二个手 指放在屏幕上,系统会忽略该触摸事件,而不会将它报告给视图对象。如果您 希望在视图的事件处理器方法中跟踪多点触摸手势,则需要重新激活多点触摸 事件,具体方法是将视图的multipleTouchEnabled属性声明设置为 YES。 比如标签和图像视图,在初始状态下完全禁止事件处理。您可以通 过改变视图的userInteractionEnabled属性值来控制视图是否可以对事 件进行处理。当某个耗时很长的操作被挂起时,您可以暂时将这个属性设置为 NO

3、在处理触摸事件时,UIKit会通过UIView的hitTest:withEvent:和 pointInside:withEvent:方法来确定触摸事件是否发生在指定的视图 上

二、事件处理

1、事件和触摸

在iPhone OS中,触摸动作是指手指碰到屏幕或在屏幕上移动,它是一个多点 触摸序列的一部分。比如,一个pinch-close手势就包含两个触摸动作:即屏 幕上的两个手指从相反方向靠近对方。一些单指手势则比较简单,比如触击、 双击、或轻拂(即用户快速碰擦屏幕)。应用程序也可以识别更为复杂的手 势,举例来说,如果一个应用程序使用具有转盘形状的定制控件,用户就需要 用多个手指来“转动”转盘,以便进行某种精调。

事件是当用户手指触击屏幕及在屏幕上移动时,系统不断发送给应用程序的对 象。事件对象为一个多点触摸序列中所有触摸动作提供一个快照,其中最重要 的是特定视图中新发生或有变化的触摸动作。一个多点触摸序列从第一个手指 碰到屏幕开始,其它手指随后也可能触碰屏幕,所有手指都可能在屏幕上移 动。当最后一个手指离开屏幕时,序列就结束了。在触摸的每个阶段,应用程 序都会收到事件对象。

触摸信息有时间和空间两方面,时间方面的信息称为阶段(phrase),表示触 摸是否刚刚开始、是否正在移动或处于静止状态,以及何时结束—也就是手指 何时从屏幕举起(参见图3-1)。触摸信息还包括当前在视图或窗口中的位置 信息,以及之前的位置信息(如果有的话)。当一个手指接触屏幕时,触摸就 和某个窗口或视图关联在一起,这个关联在事件的整个生命周期都会得到维 护。如果有多个触摸同时发生,则只有和同一个视图相关联的触摸会被一起处 理。类似地,如果两个触摸事件发生的间隔时间很短,也只有当它们和同一个 视图相关联时,才会被处理为多触击事件。

图3-1 多点触摸序列和触摸阶段

在iPhone OS中,一个UITouch对象表示一个触摸,一个UIEvent对象表示 一个事件。事件对象中包含与当前多点触摸序列相对应的所有触摸对象,还可 以提供与特定视图或窗口相关联的触摸对象(参见图3-2)。在一个触摸序列

 

发生的过程中,对应于特定手指的触摸对象是持久的,在跟踪手指运动的过程 中,UIKit会对其进行修改。发生改变的触摸属性变量有触摸阶段、触摸在视图 中的位置、发生变化之前的位置、以及时间戳。事件处理代码通过检查这些属 性的值来确定如何响应事件。

图3-2 UIEvent对象及其UITouch对象间的关系

系统可能随时取消多点触摸序列,进行事件处理的应用程序必须做好正确响应 的准备。事件的取消可能是由于重载系统事件引起的,电话呼入就是这样的例 子。

2、事件的传递

时间: 2024-08-23 10:04:50

iOS触摸事件总结的相关文章

IOS触摸事件和手势识别

IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 开始触摸所触发的方法 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 移动时触发的方法 -(void)touchesEnded:(N

IOS 触摸事件分发机制详解

欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 作者:MelonTeam 前言 很多时候大家都不关心IOS触摸事件的分发机制的实现原理,当遇到以下几种情形的时候你很可能抓破头皮都找不到解决方案: 某个点击消息由父视图来处理,子视图怎么把消息传递给父视图 这个按钮不灵敏,怎么扩大点击响应区域 怎么在一个页面处理手绘.表情拖动放缩.文本编辑三种消息 阅读本文,你会明白两个问题:IOS如何找到响应者.响应者是如何做出响应,明白这两个问题你就能解决类似上述的疑难杂症.通过控制Hit-test v

iOS触摸事件深度解析-备用

概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下

iOS触摸事件

步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下面解释一下处理原理: 1.手指触摸屏幕,这个动作被包装成一个UIEvent对象发送给当前活跃的UIApplic

iOS触摸事件深入

转载自:http://www.cnblogs.com/wengzilin/p/4720550.html 概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEv

iOS触摸事件应用举例

1. 触摸事件的类型 触摸事件的类型一共有四个,一次完整的触摸,至少包括开始和结束两个事件 1> 触摸开始,用手指(一根或者多根)按在屏幕上 2> 触摸移动,手指在屏幕上发生移动(有可能会发生) 3> 触摸结束,手指从屏幕上离开 4> 触摸被取消,因为系统事件(例如电话呼叫)一次触摸事件被取消 #pragma mark ***触摸开始 - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event #pragma m

【原】iOS触摸事件深度解析

概述 本文主要解析从我们的手指触摸苹果设备到最终响应事件的整个处理机制.本质上讲,整个过程可以分为两个步骤: 步骤1:找目标.在iOS视图层次结构中找到触摸事件的最终接受者: 步骤2:事件响应.基于iOS响应者链(Responder Chain)处理触摸事件 找目标 在找目标阶段所使用到的两大利器是UIView的 hitTest:withEvent: 以及 pointInside:withEvent: 方法.找目标的过程也称为hit-Testing.先来看一张图(注: 图来自MJ)比较直观: 下

IOS 触摸事件的处理

触摸事件的处理1.判断触摸点在谁身上: 调用所有UI控件的- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event 2.pointInside返回YES的控件就是触摸点所在的UI控件 3.由触摸点所在的UI控件选出处理事件的UI控件: 调用- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event

iOS 触摸事件与UIResponder(内容根据iOS编程编写)

触摸事件 因为 UIView 是 UIResponder 的子类,所以覆盖以下四个方法就可以处理四种不同的触摸事件: 1.  一根手指或多根手指触摸屏幕 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event; 2.  一根手指或多根手指在屏幕上移动(随着手指的移动,相关的对象会持续发送该消息) - (void)touchesMoved:(NSSet<UITouch *>