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

触摸事件

与触摸事件相关的四个方法如下:

  • 一根手指或多根手指触摸屏幕

     -(void)touchesBegan:(NSSet *)touches
withEvent:(UIEvent *)event;
  • 一根手指或多根手指在屏幕上移动(随着手指的移动,相关的对象会持续发送该消息)

 -(void)touchesMoved:(NSSet *)touches
withEvent:(UIEvent *)event;
  • 一根手指或多根手指离开屏幕

 -(void)touchesEnded:(NSSet *)touches
withEvent:(UIEvent *)event;
  • 在触摸操作正常结束之前,某个系统事件(例如有电话进来)打断了触摸过程

 -(void)touchesCancelled:(NSSet *)touches
withEvent:(UIEvent *)event;

UITouch对象和事件相应方法的工作机制

  • 一个UITouch对象对应屏幕上的一根手指。只要手指没有离开屏幕,相应的UITouch对象就会一直存在。这些UITouch对象都会保存对应的手指在屏幕上的当前位置

  • 在触摸事件的持续过程中,无论发生什么,最初发生触摸事件的那个视图都会在各个阶段收到应用的触摸事件消息。即使手指在移动时离开了这个视图的frame区域,系统还是会向该视图发送touchesMoved:withEvent:和touchesEnded:withEvent:消息。也就是说,当某个视图发生触摸事件后,该视图将永远“拥有”当时创建的所有UITouch对象。

  • 自己编写的代码不需要也不应该保留任何UITouch对象。当某个UITouch对象的状态发生改变时,系统会向指定的对象发送特定的事件消息,并传入发生变化的UITouch对象

iOS在处理触摸事件的机制和windows中的消息机制很相似。当某个应用发生触摸事件后,系统都会将该事件添加到一个事件队列里,这个事件队列是由UIApplication单例管理的。UIApplication会向“拥有”该事件的视图发送特定的UIResponder消息,收到消息的视图会进行进一步的处理。

多点触摸

默认情况下,视图在同一时刻只能接收一个触摸事件。如果一根手指已经出发了touchesBegan:withEvent:方法,那么在手指离开屏幕之前(触发touchesEnded:withEvent:方法之前),其他触摸事件都会被忽略。为此,需要在接收触摸事件的UIView的初始化方法中添加如下代码,以允许多点触摸

self.multipleTouchEnabled = YES;

响应对象链

UIResponder对象的子类对象除了UIView外,还包括UIViewController、UIWindow和UIApplication,这些对象能够通过响应对象链接收事件。
UIResponder对象拥有一个名为nextResponder的指针,相关的UIResponder对象可以通过该指针组成一个响应对象链,如下图所示

当UIView对象属于某个UIViewController对象时,其nextResponder指针就会指向包含该视图的UIViewController对象。当UIView对象不属于任何UIViewController对象时,其nextResponder指针就会指向该视图的父视图。UIViewController对象的nextResponder指针通常会指向其视图的父视图。最顶层的父视图是UIWindow对象,而UIWindow对象的nextResponder指向的是UIApplication单例。
如果没有为某个UIResponder对象覆盖特定的事件处理方法,那么该对象的nextResponder会尝试处理相应的触摸事件。事件会沿着响应对象链传播,知道传递给UIApplication对象(响应对象链的最后一个对象),如果UIApplication也无法处理事件,系统就会丢弃该事件。

iOS学习笔记之触摸事件&UIResponder的更多相关文章

  1. iOS学习笔记07-运动事件和远程控制

    之前我们已经学习了触摸处理和手势识别,其实这两个同属于iOS事件的触摸事件,今天我们来学习下iOS事件的另外两个事件: 一.运动事件 运动事件,是通过加速器进行触发,和触摸事件一样,继承UIRespo ...

  2. iOS学习笔记05-触摸事件

    一.事件分发处理[由外到内] 在iOS中发生触摸后,事件会加到UIApplication事件队列,UIApplication会从事件队列取出最前面的事件进行分发处理,通常会先分发给主窗口,主窗口会调用 ...

  3. ‎Cocos2d-x 学习笔记(16) 触摸事件与分发 EventTouch dispatchTouchEvent EventListenerTouch

    1. EventTouch 触摸事件的成员变量:枚举EventCode.存储Touch的容器. 不同的EventCode代表不同时机的触摸事件,能让监听器调用不同的回调函数. enum class E ...

  4. iOS学习笔记-精华整理

    iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...

  5. iOS学习笔记总结整理

    来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...

  6. IOS学习笔记(四)之UITextField和UITextView控件学习

    IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...

  7. iOS学习笔记之UITableViewController&UITableView

    iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...

  8. IOS学习笔记48--一些常见的IOS知识点+面试题

      IOS学习笔记48--一些常见的IOS知识点+面试题   1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...

  9. iOS学习笔记-自己动手写RESideMenu

    代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...

随机推荐

  1. django在读取数据库时未筛选到符合条件的记录会报错

    (1)报错情况如下: DoesNotExist: Publisher matching query does not exist.   (2)处理方法: try:    p = Publisher.o ...

  2. SerializeField和HideInInspector

    在Unity中,一个变量为公有类型,但是呢你不想让它显示在属性面板上,这个时候用 [HideInInspector] 这是隐藏的意思,举例: 用了[HideInInspector] 之后 就是这样用的 ...

  3. JVM总结(二):垃圾回收器

    这一节我们来总结一下JVM垃圾收集器方面的东西. 垃圾回收器 判断对象引用是否失效 对象生存判断算法 引用判断过程 垃圾收集算法简介 垃圾收集器 新生代垃圾收集器 老年代垃圾收集器 新生代和老年代垃圾 ...

  4. Java中Dom解析XML

    DOM将整个XML文件加载到内存中,并构建出节点树:应用程序可以通过遍历节点树的方式来解析XML文件中的各个节点.属性等信息:这种方式便于对XML节点的添加修改等,而且解析也很方便,然后它比较耗费内存 ...

  5. golang基础数据结构链表

    链表 链表(Linked list),是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer). 每个节点包含下一个节点的地址,这样把所有的节点串起来了, ...

  6. POJ - 1019 Number Sequence (思维)

    https://vjudge.net/problem/POJ-1019 题意 给一串1 12 123 1234 12345 123456 1234567 12345678 123456789 1234 ...

  7. Java开发中各种集合框架简介

    在大数据MapReduce作业开发中,我们经常会遇到一些大小表的join,这是如果这个小表足够“小”的话,我们可以使用进行“map-join-side”,这要就可以有效的降低reduce端的压力,但是 ...

  8. apache - http

    apahce 添加模块编译 httpd   # so模块用来提供DSO支持的apache核心模块 # 如果编译中包含任何DSO模块,则mod_so会被自动包含进核心. # 如果希望核心能够装载DSO, ...

  9. JavaScript之JS单线程|事件循环|事件队列|执行栈

    本博文基于知乎"JavaScript作用域问题?"一问,而引起了对JavaScript事件循环和单线程等概念与实践上的研究.深入理解. 一.概念 0.关键词:JavaScript单 ...

  10. mysql案例~关于mysql的配置文件个人见解

    mysql 设置参数解读一  mysql的参数分为几类     1 session级别可以设置     2 global级别可以设置     3 session+global级别可以设置     4 ...