iOS学习笔记05-触摸事件

一、事件分发处理【由外到内】

在iOS中发生触摸后,事件会加到UIApplication事件队列,UIApplication会从事件队列取出最前面的事件进行分发处理,通常会先分发给主窗口,主窗口会调用hitTest:withEvent:方法,查找适合的事件触发视图,即 找到被触摸的视图对象

寻找流程如下:
  1. 在顶级视图(keyWindow的视图)上调用pointInside:withEvent:方法判断触摸点是否在当前视图内;
  2. 如果返回NO,那么keyWindow的hitTest:withEvent:返回nil;
  3. 如果返回YES,那么它会向当前视图的所有子视图发送hitTest:withEvent:消息,遍历所有子视图的顺序是从subviews数组的末尾向前遍历(从界面最上方开始向下遍历);
  4. 如果有subview的hitTest:withEvent:返回非空对象,则keyWindow的hitTest:withEvent:返回此对象,处理结束;
  5. 如果所有subview遍历结束仍然没有返回非空对象,则keyWindow的hitTest:withEvent:返回顶级视图;

二、响应者链条【由内到外】

找到被触摸的视图对象后,还需要判断该视图对象是否能处理该触摸事件,如果不能处理,又该让谁来处理,于是响应者链条出现,作用是 找到事件响应者

响应者链条原则:
  1. 触摸对象initalView无法响应事件时,传递给上级视图superView去响应
  2. 如果上级视图无法响应,继续往上传递
  3. 往上传递直到传递到视图控制器的根视图controllerView,如果根视图不响应,传递给视图控制器viewController
  4. 视图控制器不响应,传递给父视图控制器的根视图superControllerView,如果根视图不响应,传递给父视图控制器superViewController
  5. 顶级视图控制器不能响应,传递给主窗口keyWindow
  6. keyWindow不能响应,传递给UIApplication处理
  7. UIApplication不能响应,该事件就会被 抛弃

三、继承UIResponder

以上 事件分发 和 响应者链条 ,都不需要我们关心,这些操作是自动执行的,不需要我们去操作,我们只需要了解它们的原理就行。
在iOS中并不是所有的类都能处理并接受事件,只有继承UIResponder的对象才能处理事件(我们常用的UIViewUIViewControllerUIApplication都继承自UIResponder,它们都能接收并处理事件),但继承UIResponder又不意味着一定能处理事件

继承 UIResponder 的对象,不能处理事件的情况:
  • userInteractionEnabled = NO;
  • hidden = YES;
  • alpha = 0 ~ 0.01;
  • 没有实现touchesBegan:withEvent方法
重写UIResponder 触摸响应方法:
#pragma mark 触摸开始时会调用
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸移动时会频繁调用
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸结束离开屏幕时会调用
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event;
#pragma mark 触摸意外取消时会调用,比如触摸时电话打进来
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event;

四、UITouch对象

在 UIResponder 触摸响应方法中,需要获取 UITouch 对象:
//取得一个触摸对象(对于多点触摸可能有多个对象)
UITouch *touch = [touches anyObject];
//取得在指定视图的触摸位置
CGPoint current = [touch locationInView:self.view];
//取得在指定视图的前一个触摸位置
CGPoint previous = [touch previousLocationInView:self.view];
其他常用属性:
  • window : 触摸所在窗口
  • view : 触摸所在视图
  • tapCount : 短时间点击次数

了解了这些,你就可以利用触摸事件做一些好玩的事情了,(^o^)/~,这里就不列具体代码了。

时间: 2024-10-10 12:44:03

iOS学习笔记05-触摸事件的相关文章

iOS学习笔记之触摸事件&UIResponder

iOS学习笔记之触摸事件&UIResponder 触摸事件 与触摸事件相关的四个方法如下: 一根手指或多根手指触摸屏幕 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; 一根手指或多根手指在屏幕上移动(随着手指的移动,相关的对象会持续发送该消息) -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; 一根手指或多根手指离开屏幕 -(void)

IOS学习笔记-触摸事件

一.事件传递的过程1.用户手指触摸屏幕,产生一个事件对象 2.系统会将这个事件对象添加到事件队列(先进先出)中 3.由UIApplication取出事件队列中的事件对象进行处理 4.UIApplication会先将事件对象传递给主要的UIWindow(当然,要先检测UIWindow是否能够接收和传递事件) 5.UIWindow会遍历所有的子控件,看看触摸点有没有落在某个子控件上面: 1> 如果触摸点没有落在子控件上,那么就由UIWindow直接处理这个事件,事件传递完毕 2> 如果触摸点落在子

iOS学习笔记(2)— UIView用户事件响应

iOS学习笔记(2)— UIView用户事件响应 UIView除了负责展示内容给用户外还负责响应用户事件.本章主要介绍UIView用户交互相关的属性和方法. 1.交互相关的属性 userInteractionEnabled 默认是YES ,如果设置为NO则不响应用户事件,并且把当前控件从事件队列中删除.也就是说设置了userInterfaceEnabled属性的视图会打断响应者链导致该view的subview都无法响应事件. multipleTouchEnabled  默认是NO,如果设置为YE

IOS学习笔记 -- Modal和Quartz2D

一. Modal1.Modal的默认效果:新控制器从屏幕的最底部往上钻,直到盖住之前的控制器为止;Modal只是改变了View的现实,没有改变rootViewController 2.常用方法1>.以Modal的形式展示控制器- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion2>.关

iOS学习笔记-精华整理

iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始等待用户的操作,自动释放池就会被释放掉(调用dealloc),池中的对象都会收到一个release,有可能会因此被销毁. 2-成员属性:     readonly:不指定readonly,默认合成getter和setter方法.外界毫不关心的成员,则不要设置任何属性,这样封装能增加代码的独立性和安全

iOS学习笔记之UITableViewController&UITableView

iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论文,因此需要继续思考新的算法.这是一件挺痛苦的事情,特别是在很难找到与自己研究方向相关的文献的时候.也许网格序列水印这个课题本身的研究意义就是有待考证的.尽管如此,还是要努力的思考下去.由于实验室的原因,iOS的学习进度明显受到影响,加之整理文档本身是一件耗费时间和精力的事情,因此才这么久没有写笔记了. M

iOS学习笔记(3)— 屏幕旋转

iOS学习笔记(3)— 屏幕旋转 一.屏幕旋转机制: iOS通过加速计判断当前的设备方向和屏幕旋转.当加速计检测到方向变化的时候,屏幕旋转的流程如下: 1.设备旋转时,系统接收到旋转事件. 2.系统将旋转事件通过AppDelegate通知当前的主Window. 3.window通知它的rootViewController. 4.rootViewController判断所支持的旋转方向,完成旋转. iOS系统中屏幕旋转事件没有像触碰事件那样进行hitTest,所以只有rootViewControl

iOS学习笔记(1)— UIView 渲染和内容管理

iOS学习笔记(1)— UIView 渲染和内容管理 iOS中应用程序基本上都是基于MVC模式开发的.UIView就是模型-视图-控制器中的视图,在iOS终端上看到的.摸到的都是UIView. UIView在屏幕上定义了一个矩形区域和管理区域内容的接口.在运行时,一个视图对象控制该区域的渲染:UIView继承自UIResponder,UIResponder是用来响应事件的类,UIView也具有响应事件的能力.所以说UIView具有三个基本的功能,绘制内容并管理内容的布局,响应用户交互,动画.正是

IOS学习笔记 -- 多线程

多线程1.多线程的原理 1>.同一时间,CPU只能处理1条线程,只有1条线程在工作(执行) 2>.多线程并发(同时)执行,其实是CPU快速地在多条线程之间调度(切换) 3>.如果CPU调度线程的时间足够快,就造成了多线程并发执行的假象如果线程非常非常多,会发生: 1>.CPU会在N多线程之间调度,CPU会累死,消耗大量的CPU资源 2>.每条线程被调度执行的频次会降低(线程的执行效率降低) 2.多线程的优缺点 1>.多线程的优点 能适当提高程序的执行效率 能适当提高资源