前言
无论是Android,还是IOS,都是事件驱动的操作系统,事件是操作系统的灵魂。却很少有人能够理清楚事件在操作系统内部是如何进行传递处理的。这篇文章将深入探讨iOS系统事件,阐述事件是如何在iOS系统内部进行传递并处理的,希望这篇文章能够对你有所帮助。
代码说明
本文将使用Objective-C语言进行编码,使用Cocoapods作依赖管理。同时,使用了一个非常优秀的自动布局库PureLayout。PureLayout是拥有非常优秀的自动布局API,支持iOS和OS X双系统,强烈推荐大家使用。
基本原理
事件的分类
iOS系统将事件分为三类:
* Multitouch Events
* Motion Events
* Remote Control Events
Multitouch Events: 所谓的多点触摸事件,非常好理解,即用户触摸屏幕交互产生的事件类型。
Motion Events: 所谓的移动事件。是指用户在摇晃,移动和倾斜手机的时候产生的事件成为移动事件。这类事件依赖于iPhone手机里面的加速计,陀螺仪等传感器。
Remote Control Events:所谓的远程控制事件。这个事件从名称上面看,不太好理解。但其实,这个事件指的是用户在操作多媒体的时候产生的事件。比如,播放音乐、视频等。
仔细分析这三类事件,Multitouch Events有明确的触摸视图,UIKit框架的View对象可以明确获取到当前点击的视图对象以及坐标。然后,对触摸视图做出相应的响应。而Motion Events和Remote Control Events却没有一个明确的交互界面的概念。iOS系统为了支持对这类事件的响应,提出了Responder的概念。
关于Responder,我们后面再来探讨。
鉴于系统对这三类事件处理的区别,我们将这三类事件区分为两类:
* Multitouch Events 有明确的交互界面,可以获取到当前点击的视图组件,并作出相应的响应。
* Motion Events and Remote Control Events 没有明确的交互界面,依赖于Responder对事件作出相应的响应
Continue
首先,让我们来了解一下Responder的概念,什么是Responder,怎样才能成为Responder,Responder又是如何对事件作出响应的。
About Responder
1) 什么是Responder?
Responder是UIKit框架封装的一个对象类型,它可以响应并处理事件。所有Responder对象的基类都是UIResponder,下面我们来通过一张类图看看哪些对象具有Responder特性
从上图可以看出,UIApplication、UIViewController和UIView都是UIResponder对象,都具有对事件进行响应,处理的能力
再来看看UIResponder类里面的一些方法和属性
- (UIResponder* )nextResponder; - (BOOL)canBecomeFirstResponder; // default is NO - (BOOL)becomeFirstResponder; // Touch Event - (void)touchesBegan:(NSSet
总结
iOS系统将事件分为三类:
* Touch Events
* Motion Events
* Remote Control Events
根据三类事件获取First Responder方式的不同,又可以将事件分为:
* Touch Events
* Motion Events and Remote Control Events
第一类事件通过获取当前用户交互的界面组件,即为First Responder
第二类事件的First Responder由用户手动指定。
成为First Responder必须实现如下两个步骤:
* 重写canBecomeFirstResponder方法,返回YES
* 给UIResponder对象发送becomeFirstResponder消息
综上所述,事件的传递过程可以分为两步:
第一步,获取到First Responder,不同的事件有不同的获取方式。
第二步,从First Responder沿着Responder Chain传递到nextResponder,直到事件被处理或者舍弃。
常见的Responder传递方向有:
Initial View -> Parent View -> ViewController -> Window -> Application
如果最终传递到Application对象,依然没有对事件作出响应,事件就会被舍弃掉。
通常来说,子视图的nextResponder即为其父视图。如果子视图直接依附于ViewController,则该子视图的nextResponder即为其依附的ViewController
PS:本文源码和文章原稿都在下方我的Github仓库中,有任何问题请按照下面的方式联系我。
参考资料:Event Handling Guide for iOS
如果你喜欢这篇文章,请到Fork我的github仓库:
https://github.com/yuanhoujun/jianshu.git
如果你对这篇文章有任何的修改建议,请给我发送Pull Request。如果你想给我留言,可以加我的QQ:626306805,如果你想和更多的人一起讨论iOS,请加入iOS交流群:468167089