获取当前显示的VC
2015-04-29 21:30
113 查看
从一个需求问题看iOS的事件处理
发表于 2014年 3 月 23 日 由 三石
本文从一个小需求点开始,简要整理下iOS事件处理相关的内容。鉴于容易吓到小朋友,就不以“一个XX引发的血案”做标题了,虽然本文用这类标题很吸引人也很“适合”。
前两天遇到的一个需求是封装一个SDK,在某个API调用的时候需要知道应用当前展现在屏幕最前层对应的Controller对象。最终大概的方案是这样的:
0. 示例代码解释
前半部分是“找Window”,后半部分是“在Window中找View和对应的Controller”。
在iOS中,window这个概念对应于UIWindow类,主要负责展示视图和做事件分发处理。而UIWindow对象中有一个属性叫做windowLevel,标志着这个window在显示和事件处理方面的层级,我们正常运行中看到的window是默认的UIWindowLevelNormal,对应为0,此外还定义了两个级别的常量,对应statusBar和alert。而这里我们要找的,就是UIWindowLevelNormal这个层面的window对象。
Window既然是展现视图的,那么也就要从view找起,通过index为0的UIView向上找,直到“响应链”上的一个ViewController。
1. Responder链
在上面那段示例代码中,可以看到,后面寻找特定Controller的过程实际上就是根据nextResponder属性进行迭代。这个nextResponder实际上是UIResponder类的一个方法,返回的引用也是一个UIResponder类对象。
UIResponder是什么?它可以是一个UIView(包括UIControl和UIWindow)、UIViewController,甚至可以是一个UIApplication。
看UIResponder类,它提供了很多功能,而其中最主要的自然是负责响应事件。在iOS中,响应的事件可分为3类:
UIEventTypeTouches,屏幕触摸事件
UIEventTypeMotion,设备接受到的动作
UIEventTypeRemoteControl,遥控事件
而这3者都需要Responder链。其中Motion和RemoteControl事件需要FirstResponder,而Touch虽然和此二者不完全相同,对事件的响应路径也是基于Responder链的。
而Responder链的路径如下图所示(引自苹果官方文档):
2. 事件处理基本流程
上面通过对Responder Chain的介绍,解释了上面示例代码中的内容。借这个机会也把iOS事件处理的大致流程。
以触摸事件为例,操作系统会将用户的触屏操作记录下来,封装成事件对象并放到应用的事件队列。应用中的主循环会获取事件队列里的事件对象,交给window对象处理。
Window对象根据事件的情况和Responder Chain分发给特定的Responder对象进行处理。
对于触摸类型的事件,默认情况下,window对象会先将各个事件优先交给Gesture Recognizer分析处理,如果未能识别,特定的view会根据事件的时机做具体的处理。Gesture Recognizer采用优先状态机的方式对用户的手势进行识别。
3. 事件Event
在事件处理过程中,事件Event对象是一个比较基本的要素,我们再来稍微看下。
在iOS中,UIEvent是对应的类。我们可以通过UIKit下的UIEvent头文件来看这个类的定义,虽然这个头文件中有了Event的三种类型及子类型的定义。但毕竟Motion和RemoteControl的事件略有特别,类定义中更多的是触摸事件相关的。
对于Motion事件的处理,官方的文档给出了3个层面的方式:
基本处理,使用UIDevice和Notification,监测orientation的变化
简单响应,通过UIResponder对motion的几个方法定义
复杂处理,使用加速器和陀螺仪相关的framework,对设备的动作细节数据做全面的收集、分析和处理
对于Remote Control,主要是对于多媒体的播放控制,这里不详细说。
最后,我们看下最常见的触摸事件,我们前面说到UIEvent类定义中很多是针对触摸的,其中用到了UITouch。UITouch类对触摸事件的位置、时长、次数、相关的view和所处阶段都有清晰的记录。
这篇文章为本人参考苹果文档整理的原创,欢迎大家沟通交流讨论。
以上转载自:http://www.molotang.com/articles/1513.html
相关文章推荐
- VC++获取系统当前时间并显示
- VC如何获取并显示当前系统时间
- 获取应用程序的当前目录(VC)
- VC中如何获取当前计算机中所有逻辑驱动器的数目和盘符
- [转]VC获取当前程序文件的路径,文件名以及路径+文件名
- 【转载】VC获取当前路径及程序名
- easy UI中利用JS获取当前月的第一天和最后一天,并显示到时间控件上
- 获取当前显示的Activity
- 获取当前屏幕显示的viewcontroller
- iOS获取当前时间日期,并按规定格式显示【原创】
- Javascript获取当前系统时间并显示
- Java获取当前年月日并输出显示。
- JS简单获取及显示当前时间的方法
- VC获取当前程序文件的路径,文件名以及路径+文件名
- VS2005下使用VC,部分断点无效,显示『当前不会命中断点。还没有为该文档加载任何符号』。
- MOSS 站点下取获取当前登录人的显示名(中文姓名)
- visibleViewController和topViewController 获取当前显示的页面
- VC中获取当前exe文件运行路径
- js获取当前时间显示在页面上并每秒刷新
- iOS 获取当前正在显示的ViewController