获取屏幕最前层对应的Controller对象_第1页
获取屏幕最前层对应的Controller对象_第2页
获取屏幕最前层对应的Controller对象_第3页
获取屏幕最前层对应的Controller对象_第4页
获取屏幕最前层对应的Controller对象_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、从一个需求问题看iOS的事件处理发表于 2014 年 3 月 23 日 由 三石本文从一个小需求点开始,简要整理下iOS事件处理相关的内容。鉴于容易吓到小朋友,就不以“一个XX引发的血案”做标题了,虽然本文用这类标题很吸引人也很“适合”。前两天遇到的一个需求是封装一个SDK,在某个API调用的时候需要知道应用当前展现在屏幕最前层对应的Controller对象。最终大概的方案是这样的:1234567891011121314151617181920212223UIViewController *result = nil; UIWindow * window

2、= UIApplication sharedApplication keyWindow;if (window.windowLevel != UIWindowLevelNormal)    NSArray *windows = UIApplication sharedApplication windows;    for(UIWindow * tmpWin in windows)           

3、0;if (tmpWin.windowLevel = UIWindowLevelNormal)                    window = tmpWin;            break;      

4、60;      UIView *frontView = window subviews objectAtIndex:0;id nextResponder = frontView nextResponder; if (nextResponder isKindOfClass:UIViewController class)    result = nextResponder;else    result = window.rootViewContro

5、ller;这其中有Window和Responder的概念,这些都是和iOS事件处理相关的内容,下面基于这个代码示例解释和整理一下。0. 示例代码解释前半部分是“找Window”,后半部分是“在Window中找View和对应的Controller”。在iOS中,window这个概念对应于UIWindow类,主要负责展示视图和做事件分发处理。而UIWindow对象中有一个属性叫做windowLevel,标志着这个window在显示和事件处理方面的层级,我们正常运行中看到的window是默认的UIWindowLevelNormal,对应为0,此外还定义了两个级别的常量,对应statusBar和ale

6、rt。而这里我们要找的,就是UIWindowLevelNormal这个层面的window对象。Window既然是展现视图的,那么也就要从view找起,通过index为0的UIView向上找,直到“响应链”上的一个ViewController。1. Responder链在上面那段示例代码中,可以看到,后面寻找特定Controller的过程实际上就是根据nextResponder属性进行迭代。这个nextResponder实际上是UIResponder类的一个方法,返回的引用也是一个UIResponder类对象。UIResponder是什么?它可以是一个UIView(包括UIControl和UIW

7、indow)、UIViewController,甚至可以是一个UIApplication。看UIResponder类,它提供了很多功能,而其中最主要的自然是负责响应事件。在iOS中,响应的事件可分为3类:§ UIEventTypeTouches,屏幕触摸事件§ UIEventTypeMotion,设备接受到的动作§ UIEventTypeRemoteControl,遥控事件而这3者都需要Responder链。其中Motion和RemoteControl事件需要FirstResponder,而Touch虽然和此二者不完全相同,对事件的响应路径也是基于Responde

8、r链的。而Responder链的路径如下图所示(引自苹果官方文档):2. 事件处理基本流程上面通过对Responder Chain的介绍,解释了上面示例代码中的内容。借这个机会也把iOS事件处理的大致流程。以触摸事件为例,操作系统会将用户的触屏操作记录下来,封装成事件对象并放到应用的事件队列。应用中的主循环会获取事件队列里的事件对象,交给window对象处理。Window对象根据事件的情况和Responder Chain分发给特定的Responder对象进行处理。对于触摸类型的事件,默认情况下,window对象会先将各个事件优先交给Gesture Recognizer分析处理,如果未能识别,特

9、定的view会根据事件的时机做具体的处理。Gesture Recognizer采用优先状态机的方式对用户的手势进行识别。3. 事件Event在事件处理过程中,事件Event对象是一个比较基本的要素,我们再来稍微看下。在iOS中,UIEvent是对应的类。我们可以通过UIKit下的UIEvent头文件来看这个类的定义,虽然这个头文件中有了Event的三种类型及子类型的定义。但毕竟Motion和RemoteControl的事件略有特别,类定义中更多的是触摸事件相关的。对于Motion事件的处理,官方的文档给出了3个层面的方式:§ 基本处理,使用UIDevice和Notification,监测orientation的变化§ 简单响应,通过UIResponder对motion的几个方法定义§ 复杂处理,使用加速器和陀螺仪相关的framework,对设备的动作细节数据做全面的收集、分析和处理对于Remote Control,主

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论