【iOS7的一些总结】11、iOS中的事件

1、原理

      在应用程序成功启动后,应用程序就开始由外部事件进行驱动。应用程序不断获取事件,并作出响应并更新用户界面,然后等待下一个事件。这对事件进行循环响应的整个机制,称为主要事件循环,由一个全局应用程序对象(一个UIApplication实例)进行管理。

      在事件循环中最重要的事件之一就是用户与设备的交互操作。在iOS设备中,用户对设备的操作可以通过多种方式,如点击屏幕或者晃动设备等。iOS操作系统会解析这些操作,并将响应通知应用做出相应。对这些操作进行更加自然和直观的相应可以增强应用的用户友好度。在ios中,这些响应以事件Event的方式实现。在ios中,一般把事件分为三大类:①触控事件,用于处理用户对屏幕的多点触控操作;②运动事件,用户处理设备的移动、摇晃和方向变换等操作;③遥控事件,用户处理用户的遥控设备对ios设备的操作(如线控耳机等)。

      封装了三种事件的UIKit类——UIEvent:UIEvent类封装了事件的类型之外,还封装了应用对事件的响应信息。每一次操作发生时操作系统都会发出一个UIEvent对象,每个对象都会使用类型(type)和子类型(subtype)来表示事件的类型。

2、触控事件的处理:

通过重写以下方法监听触控事件:

- (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;

在以上函数中,NSSet类型的参数touches代表触控屏幕有几根手指,每一个元素都是一个UITouch实例,可以调用tapCount方法获取短时间内的点击次数。除此之外,还有window、view、phase等属性,分别表示触控发生的窗口、视图和周期(开始、移动、结束、取消)。

UITouch类的方法主要有:

- (CGPoint)locationInView:(UIView *)view;//返回触控相对于视图的坐标点
- (CGPoint)previousLocationInView:(UIView *)view;//返回前一个触控的坐标点

3、 消息传递的响应链

      用户产生的事件发生之后,UIKit会产生一个包含相应的处理所需信息的event对象,并将其放入活动app的事件队列中。如果是触控事件,对象封装在UIEvent中;如果是运动事件,对象封装根据运动类型和采用框架的不同而不同。一个事件沿事件传递路径传递,直到找到一个可以处理当前事件的对象为止。首先,UIApplication单例对象从事件队列的顶部取出一个事件,并通常传送至窗口对象处理。对于触控事件,窗口对象首先尝试将其传送至触控发生的视图对象以供处理;对于运动事件和遥控事件,窗口对象将其发送到定义的第一响应者对象处理。

(1)查找触控事件的响应:iOS通过“触击检测”(hit-testing)机制判断发生触控的视图。
      众所周知,屏幕上的视图由父视图和子视图构成了一个树形的结构,我们称为视图树。触击检测通过自顶向下检测触控发生在哪一个视图范围内,最终确定包含触控发生点并且在视图树中最低层的视图为目标视图。给定视图上的一个点(CGPoint)和事件(UIEvent),可以使用 hitTest:withEvent: 实现该功能,返回相应的目标视图。

(2)响应链由响应者对象构成:

      响应链由第一响应者开始,终于应用对象(UIApplication object),由响应者对象组成。在iOS中,响应者对象由UIResponder类实现,该类用于实现事件响应以及其他的响应操作,是UIApplication、UIViewController和UIView等类的基类。第一响应者是其中第一个接受事件的对象,通常为一个视图对象。某对象称为第一响应者,需要完成两部:第一重写
canBecomeFirstResponder方法并返回YES;第二调用 becomeFirstResponder。

      响应链可以处理下面几种问题:

  • 触控事件:如果触击检测返回的视图不能处理该事件,事件就会沿着响应链向上传递直到某对象可以处理该事件;
  • 运动事件:第一响应者必须实现UIResponder类的motionBegan:withEvent:和motionEnded:withEvent:方法来处理这类事件;
  • 遥控事件:第一响应者需实现 remoteControlReceivedWithEvent:方法;
  • Action消息:如果某个控件(如按钮)被点击,而且该控件没有设置target,那么这个消息就将沿着响应链传递;
  • 编辑菜单消息:点击编辑菜单的命令后,iOS使用响应链寻找可以实现编辑命令(如剪切复制粘贴等)的对象;
  • 文本编辑:当点击文本编辑框时,该对象称为第一响应者,同时默认弹出虚拟键盘。可以通过resignFirstResponder消息放弃第一响应者,可以关闭虚拟键盘并结束编辑状态。只有文本编辑框可以在用户点击时自动称为第一响应者,其他对象必须调用becomeFirstResponder方法来称为第一响应者。

(3)响应链的响应顺序:

      如果响应链的第一个元素(触击检测返回视图,或者第一响应者)不能处理事件,那么事件将会传递至响应链的第二个元素。如果响应链的某个元素不能处理该事件,会将其继续向下传递直到响应链上没有可以处理的对象为止。

      当iOS检测到一个事件时,响应链开始工作,将事件传递给第一个元素(通常为某视图,即初始视图),该元素有最优先处理事件的机会。通常情况下,事件传递的顺序为:初始视图尝试处理事件,如果不能处理则传递给其父视图;父视图尝试处理事件,如果不能处理则传递给其父视图,直至顶层视图,如果顶层视图不能处理,则传递给当前视图控制器处理;如果视图控制器不能处理,则传递给窗口对象处理;若窗口对象不能处理,则传递给应用单例对象处理;最后若应用对象不能处理,则放弃该事件。

时间: 2024-09-19 01:49:52

【iOS7的一些总结】11、iOS中的事件的相关文章

iOS中 最新收集的代码块(汇总) 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博!手机加iOS开发者交流QQ群: 446310206 1.iOS - 推送 openssl合并 //1.1 生成 opensslkey openssl pkcs12 -nocerts -out PushKey.pem -in apns-dev-cert.p12 //1.2 输入以上成功之后会出现以下这段: Enter PEM pass phrase:输入密码 //2.导出 pem openssl pkcs12 -c

IOS中KVC与KVO的应用解析

IOS中KVC与KVO的应用解析 一.NSKeyValueCoding(KVC) 1.从一个小例子引入 KVC键值编码是Object-C为我们提供的一种对成员变量赋值的方法.在探讨其方法之前,我们先来看一个小例子: 首先,创建一个数据模型model类: ? 1 2 3 4 5 6 7 8 //.h文件 #import <Foundation/Foundation.h> @interface Model : NSObject {     @public//将成员变量设置为公有的 以便其他文件有访

iOS中nil、Nil、NULL、NSNull详解

  这篇文章主要介绍了iOS中nil.Nil.NULL.NSNull详解的相关资料,需要的朋友可以参考下 ObjC 里面的几个空值符号经常会差点把我搞死,这些基础的东西一点要弄清楚才行,以提高码农的基本素质. nil nil 是 ObjC 对象的字面空值,对应 id 类型的对象,或者使用 @interface 声明的 ObjC 对象. 例如: ? 1 2 3 4 NSString *someString = nil; NSURL *someURL = nil; id someObject = n

iOS中RunLoop机制浅探

iOS中RunLoop机制浅探 一.浅识RunLoop         RunLoop这个家伙在iOS开发中,我们一直在用,却从未注意过他,甚至都不从见过他的面孔,那个这个神秘的家伙究竟是做什么的?首先,我们先来观察一下我们的程序运行机制.         无论是面向对象的语言或是面向过程的语言,代码的执行终究是面向过程的.线程也一样,一个线程从开始代码执行,到结束代码销毁.就像HELLO WORLD程序,打印出字符串后程序就结束了,那么,我们的app是如何实现如下这样的机制的呢:app从运行开

iOS中UITableViewController自带的刷新控件

iOS中UITableViewController自带的刷新控件 一.引言         在iOS开发中,使用tableView的界面,大多会用到一个下拉刷新的的控件,第三方库中,我们一般会选择比较好用的MJRefresh,其实,在iOS6之后,系统为我们提供了一个原生的刷新控件,使用起来非常方便,只是制定性不强,如果我们没有复杂的需求,使用UIRefreshControl也是不错的一个选择. 二.UITableViewController         相对于UIViewControlle

IOS中使用像素位图(CGImageRef)对图片进行处理

IOS中对图片进行重绘处理的方法总结 一.CGImageRef是什么 CGImageRef是定义在QuartzCore框架中的一个结构体指针,用C语言编写.在CGImage.h文件中,我们可以看到下面的定义: ? 1 typedef struct CGImage *CGImageRef; CGImageRef 和 struct CGImage * 是完全等价的.这个结构用来创建像素位图,可以通过操作存储的像素位来编辑图片. QuartzCore这个框架是可移植的. 二.CGImageRef相关的

IOS中使用本地通知为你的APP添加提示用户功能

IOS中使用本地通知为你的APP添加提示用户功能 首先,我们先要明白一个概念,这里的本地通知是UILocalNotification类,和系统的NSNotificationCenter通知中心是完全不同的概念. 一.我们可以通过本地通知做什么 通知,实际上是由IOS系统管理的一个功能,比如某些后台应用做了某项活动需要我们处理.已经退出的应用在某个时间提醒我们唤起等等,如果注册了通知,系统都会在通知触发时给我们发送消息.由此,我们可以通过系统给我们的APP添加通知用户的功能,并且应用非常广泛.例如

IOS中图片(UIImage)拉伸技巧

IOS中图片拉伸技巧与方法总结 一.了解几个图像拉伸的函数和方法 1.直接拉伸法 简单暴力,却是最最常用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小做自动拉伸.这种拉伸的方法有一个致命的缺陷,它会使图像发生失真与形变. 2.像素点的拉伸 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHe

iOS 中正则表达式使用方法汇总

iOS 中正则表达式使用方法汇总 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 某种语言中的正则工具算是木桶,而这个工具处理的是正则表达式,算是水,那么水很多,无论是淡水还是咸水,或是雨水,至