iOS的事件相应方式

最近的工作中发现基础不太牢靠。需要好好巩固一下关于iOS的事件响应的方式了。从最简单的用户用手指点击了一下屏幕开始吧。

其实总结出来就是一句话:事件会从window的最下面的view向上传递寻找可以响应该事件的view,而找到响应的对象后,需要再向下寻找最终可以对这个事件作出处理的对象~

如果手指点击了一下屏幕,那么就会生成一个事件(UIEvent),并且这个事件会被放入由UIApplication管理的事件队列中。UIApplication负责将这个事件进行分发。首先,这个事件会被分发给UIWindow。然后Window就会在自己所有的View中进行查找,找到最适合的相应该事件的那个view.这个过程中所有的view都会调用hitTest:WithEvent:方法。并且顺序为从最底层的父view开始逐渐向最上层的subView进行寻找,知道找到最后的那个hitTest:WithEvent:返回YES且pointInside:WithEvent:为YES的子view。

而在window将事件传递给View之前,会检查目前是否有UIGestureRecognizer相应该事件。如果有的话,则使用recognizer的target进行相应,而不再检查所有的子view.

如果没有recognizer,则找到了相应的view(这个view叫responder object)。这时候则会调用相应的响应的view的touches系列方法

touchesBegan:withEvent:
touchesMoved:withEvent:
touchesEnded:withEvent:
touchesCancelled:withEvent:

这几个方法的第一个参数为(NSSet *)touches, 第二个参数为(UIEvent *)event.

其中touches中所包含的元素均为UITouch类的对象。touches的count则为目前有多少个点在屏幕上进行触摸。

UITouch类有以下5个属性:

window :触碰产生时所处的窗口,由于窗口可能发生变化,当前所在的窗口不一定是最开始的窗口。

view:触碰产生时所处的视图。由于视图可能发生变化,当前视图也不一定是最初的视图。

tapCount:短时间内轻击(tap)屏幕的次数,可根据tapCount判断单击、双击或更多的轻击。

timeStamp:时间戳记录了触碰事件产生或变化时的时间。单位是秒。

phase:触碰事件在屏幕上有一个周期,即触碰开始、触碰点移动、触碰结束,中途取消。通过phase可以查看当前触碰事件在一个周期中所处的状态。UITouchPhase枚举:

UITouchPhaseBegan

UITouchPhaseMoved

UITouchPhaseStationary

UITouchPhaseEnded

UITouchPhaseCancelled

这时候,如果我们发现responder object无法处理该事件,则会沿着这个object的事件响应链进行向上传递,知道找到可以响应该事件的对象为止。

该文章参考如下三篇博客,对这三篇博客的作者表示感谢!

http://www.cnblogs.com/Quains/p/3369132.html

http://www.cnblogs.com/zhw511006/p/3517248.html

http://www.tuicool.com/articles/ZZJreu

时间: 2024-08-27 13:31:06

iOS的事件相应方式的相关文章

线程安全的事件调用方式

通常事件调用方式为 //版本1 public event NewEventHandler NewEvent;protected virtual void OnNewEvent(EventArgs e){ if (NewEvent != null) NewEvent(this, e);} 但这种方式的问题在于,在做NewEvent != null 检测之后,NewEvent事件调用之前,事件取消了注册,即NewEvent重新变成null,此时再进行调用,将会抛出异常 线程安全的做法, //版本2

iOS中的桥接方式

iOS中的桥接方式 C ->OC (__bridge tupe)expression  : 将CoreFoundation框架的对象所有权交给Foundation框架来使用,但是Foundation框架中的对象并不能管理该对象内存 (__bridge_transfer Objective-C type)expression : 将CoreFoundation框架的对象所有权交给Foundation来管理,如果Foundation中对象销毁,那么我们之前的对象(CoreFoundation)会一起

OS开发UI篇—ios应用数据存储方式(归档)

OS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 02

jQuery绑定事件-多种方式实现

jQuery绑定事件-多种方式实现: <html> <head> <meta charset="utf-8" /> <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script><!--百度CDN--> </head> <body> <input type="text"/&

iOS开发UI篇—ios应用数据存储方式(归档)

iOS开发UI篇-ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 0

iOS开发UI篇—ios应用数据存储方式(偏好设置)

iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置.比如,保存用户名.字体大小.是否自动登录 存储位置: 存储形式: 二.代码示例 1.storyboard 2.代码 1 // Created by 鑫 on 14-10-24. 2 // Copyright (c) 2014年 梁镋鑫.

js原生添加事件的方式

js原生添加事件的方式: 1. 直接在html标签上添加 <div onclick="alert('div')">div</div> 2. 用dom的on...方法添加 document.getElementById('div').onclick = function () {alert('div')}; 3. 用addEventListener或attachEvent添加 document.getElementById('div').addEventListe

iOS 应用数据存储方式(XML属性列表-plist)

iOS 应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存储自定义对象) 4.SQLite3(数据库,关系型数据库,不能直接存储对象,要编写一些数据库的语句,将对象拆开存储) 5.Core Data(对象型的数据库,把内部环节屏蔽) 二.应用沙盒 每个iOS应用都有?己的应?沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离.应?必须待在?己的沙盒里,其他应用不能访问该

ios网络判断的方式

对于ios判断网络连通方式我总结了一下几种方法: 1.Reachability. Reachability是苹果推荐的用来判断当前网络状态的第三方库.Reachability使用的主要函数包括: + (Reachability*) reachabilityWithHostName: (NSString*) hostName; + (Reachability*) reachabilityWithAddress: (const struct sockaddr_in*) hostAddress; +