美文网首页
关于IOS中的响应者链

关于IOS中的响应者链

作者: 九月oc | 来源:发表于2020-11-19 09:12 被阅读0次

今天简单的谈一下IOS开发中经常用到的响应者链,

在ios开发中所有能够响应touch事件的对象都继承自UISResponder

在平时的应用中当我们触碰手机界面的时候系统会将一个操作封装成一个UIEvent事件放到队列里,然后Applicagtion从事件队列中取出这个事件来寻找响应者, 然后再进行相对应的事件处理。

在寻找响应者的过程中 IOS每经过一个层级就会去寻找这个对象的

-(UIView*)hitTest(CGPoint)point event方法 返回当前视图层中响应触控电最深的视图

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent*)event返回视图是否包含指定的某个点。

那么很显然的 学过数据结构的同学都知道 这样的响应结构就是一个树形的响应链,一层一层的找下去。

如果没有找到这个响应者 那么事件会被抛弃。 如果找到了这个响应者那么事件会开始进行处理, 找到相对应的响应者。

一般响应者的事件有如下几个 :

-----------------------------------------------------------------------------------------------------------------------

// Generally, all responders which do custom touch handling should override all four of these methods.

// Your responder will receive either touchesEnded:withEvent: or touchesCancelled:withEvent: for each

// touch it is handling (those touches it received in touchesBegan:withEvent:).

// *** You must handle cancelled touches to ensure correct behavior in your application.  Failure to

// do so is very likely to lead to incorrect behavior or crashes.

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event;

-----------------------------------------------------------------------------------------------------------------------

如果当前的响应者没有响应这个事件, 那么响应者会调用Responder。nextResponder来传递当前的事件并且处理。

附录:IOS的响应者事件在Runloop中的实现大概如下

苹果注册了一个 Source1 (基于 mach port 的) 用来接收系统事件,其回调函数为 __IOHIDEventSystemClientQueueCallback()。

当一个硬件事件(触摸/锁屏/摇晃等)发生后,首先由 IOKit.framework 生成一个 IOHIDEvent 事件并由 SpringBoard 接收。这个过程的详细情况可以参考这里。SpringBoard 只接收按键(锁屏/静音等),触摸,加速,接近传感器等几种 Event,随后用 mach port 转发给需要的App进程。随后苹果注册的那个 Source1 就会触发回调,并调用 _UIApplicationHandleEventQueue() 进行应用内部的分发。

_UIApplicationHandleEventQueue() 会把 IOHIDEvent 处理并包装成 UIEvent 进行处理或分发,其中包括识别 UIGesture/处理屏幕旋转/发送给 UIWindow 等。通常事件比如 UIButton 点击、touchesBegin/Move/End/Cancel 事件都是在这个回调中完成的。

相关文章

  • iOS 响应链

    iOS开发 - 事件传递响应链iOS 响应者链,事件的传递事件传递之响应链Cocoa Touch事件处理流程--响...

  • 转载:响应者链工作原理

    响应者链 响应者链是由一个一个响应者组成的长链;响应者链定义了iOS中触摸事件的交互规则;如果hit-test检测...

  • iOS响应者链

    iOS响应者链

  • 事件的分发和传递

    响应者: 在iOS中,响应者为能响应事件的UIResponder子类对象,如UIButton、UIView等。 响...

  • iOS中对于响应链的理解

    对于响应链的理解: 在IOS中,有响应者链对事件进行响应,所有的响应类都是UIResponder的子类,响应者链是...

  • iOS 手势小记(一)

    关于手势的几个属性的记录 关于iOS的事件响应者链的关系hit-testting 寻找最佳响应者大家应该不陌生.但...

  • ios响应者链

    iOS 响应者链 字数418 阅读41 评论0 喜欢3 响应者链 响应者链是一个响应者的连接序列,事件或者动作消息...

  • iOS UI事件传递与响应者链

    iOS UI事件传递与响应者链 响应者链 响应者对象:继承自UIResponder的对象称之为响应者对象。UIAp...

  • 关于IOS中的响应者链

    今天简单的谈一下IOS开发中经常用到的响应者链, 在ios开发中所有能够响应touch事件的对象都继承自UISRe...

  • iOS 事件传递&响应者链

    iOS中的响应者链(Responder Chain)是用于确定响应者的一种机制。其中的事件主要指触摸事件(Touc...

网友评论

      本文标题:关于IOS中的响应者链

      本文链接:https://www.haomeiwen.com/subject/rknciktx.html