iOS事件传递

前言

无论是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 EventsRemote Control Events却没有一个明确的交互界面的概念。iOS系统为了支持对这类事件的响应,提出了Responder的概念。
关于Responder,我们后面再来探讨。

鉴于系统对这三类事件处理的区别,我们将这三类事件区分为两类:
* Multitouch Events 有明确的交互界面,可以获取到当前点击的视图组件,并作出相应的响应。
* Motion Events and Remote Control Events 没有明确的交互界面,依赖于Responder对事件作出相应的响应

Continue
首先,让我们来了解一下Responder的概念,什么是Responder,怎样才能成为Responder,Responder又是如何对事件作出响应的。

About Responder
1) 什么是Responder
ResponderUIKit框架封装的一个对象类型,它可以响应并处理事件。所有Responder对象的基类都是UIResponder,下面我们来通过一张类图看看哪些对象具有Responder特性
图-1
从上图可以看出,UIApplicationUIViewControllerUIView都是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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值