iOS学习笔记之触摸事件&UIResponder
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的更多相关文章
- iOS学习笔记07-运动事件和远程控制
之前我们已经学习了触摸处理和手势识别,其实这两个同属于iOS事件的触摸事件,今天我们来学习下iOS事件的另外两个事件: 一.运动事件 运动事件,是通过加速器进行触发,和触摸事件一样,继承UIRespo ...
- iOS学习笔记05-触摸事件
一.事件分发处理[由外到内] 在iOS中发生触摸后,事件会加到UIApplication事件队列,UIApplication会从事件队列取出最前面的事件进行分发处理,通常会先分发给主窗口,主窗口会调用 ...
- Cocos2d-x 学习笔记(16) 触摸事件与分发 EventTouch dispatchTouchEvent EventListenerTouch
1. EventTouch 触摸事件的成员变量:枚举EventCode.存储Touch的容器. 不同的EventCode代表不同时机的触摸事件,能让监听器调用不同的回调函数. enum class E ...
- iOS学习笔记-精华整理
iOS学习笔记总结整理 一.内存管理情况 1- autorelease,当用户的代码在持续运行时,自动释放池是不会被销毁的,这段时间内用户可以安全地使用自动释放的对象.当用户的代码运行告一段 落,开始 ...
- iOS学习笔记总结整理
来源:http://mobile.51cto.com/iphone-386851_all.htm 学习IOS开发这对于一个初学者来说,是一件非常挠头的事情.其实学习IOS开发无外乎平时的积累与总结.下 ...
- IOS学习笔记(四)之UITextField和UITextView控件学习
IOS学习笔记(四)之UITextField和UITextView控件学习(博客地址:http://blog.csdn.net/developer_jiangqq) Author:hmjiangqq ...
- iOS学习笔记之UITableViewController&UITableView
iOS学习笔记之UITableViewController&UITableView 写在前面 上个月末到现在一直都在忙实验室的事情,与导师讨论之后,发现目前在实验室完成的工作还不足以写成毕业论 ...
- IOS学习笔记48--一些常见的IOS知识点+面试题
IOS学习笔记48--一些常见的IOS知识点+面试题 1.堆和栈什么区别? 答:管理方式:对于栈来讲,是由编译器自动管理,无需我们手工控制:对于堆来说,释放工作由程序员控制,容易产生memor ...
- iOS学习笔记-自己动手写RESideMenu
代码地址如下:http://www.demodashi.com/demo/11683.html 很多app都实现了类似RESideMenu的效果,RESideMenu是Github上面一个stars数 ...
随机推荐
- 文件上传---form表单,ajax,jquery,以及iframe无刷新上传 (processData,contentType讲解)
服务端程序: import tornado.web import os IMG_LIST=[] class IndexHandler(tornado.web.RequestHandler): def ...
- Hbase记录-client访问zookeeper大量断开以及参数调优分析(转载)
1.hbase client配置参数 超时时间.重试次数.重试时间间隔的配置也比较重要,因为默认的配置的值都较大,如果出现hbase集群或者RegionServer以及ZK关掉,则对应用程序是灾难性的 ...
- JAVA记录-Spring两大特性
1.IOC控制反转 Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象 ...
- 缓存方案 通过SqlDependency实现Cache和Database的同步
对于一个真正的企业级的应用来说,Caching肯定是一个不得不考虑的因素,合理.有效地利用Caching对于增强应用的Performance(减少对基于Persistent storage的IO操作) ...
- jquery ajax 跨域请求【原】
前台 function sending(){ $.ajax({ type : "get",//jsonp只能get async:true, url : "/webcont ...
- ps知识集锦
1.工具箱 移动工具 [V]矩形.椭圆选框工具 [M]套索.多边形套索.磁性套索 [L]快速选择工具.魔棒工具 [W] 裁剪.透视裁剪.切片.切片选择工具 [C]吸管.颜色取样器.标尺.注释.12 ...
- 怎样动态地插入不会暴露给用户的JS文件
也是无意间看见的,以前想过这个问题,但是没多想,今天看到这段代码豁然开朗 (function() { var dynamicScript = document.createElement('scrip ...
- WIN10下安装USB转串口驱动出现“文件的哈希值不在指定的目录”的解决办法
今天安装openJTAG驱动时出现“文件的哈希值不在指定的目录”,系统为WIN10专业版. 原因是驱动无数字签名,在WIN10中是不安全的驱动,所以显示哈希值不在范围内不能安装. 经查阅已经解决,发放 ...
- [C++]Linux之间隔时间内循环执行指定程序
#include<time.h> #include<unistd.h>//usleep(num) #include<stdio.h> #include<std ...
- MHA-Failover(GTID,Auto_Position=0)
最近一位同学遇到的案例:凌晨数据库意外宕机,要求在一主两从的基础上,搭建MHA做故障切换.在部署测试中遇到一些问题找到我,交流的过程挖出一些之前忽略的坑,感谢这位同学无私分享!• GTID环境,KIL ...