ios 事件传递和响应链

事件传递

当一个事件触发,系统会将事件放入UIApplication事件处理队列中,UIApplication从队列中取出事件发送给UIWindow,UIWindow通过hitTest去寻找最合适的view处理事件。
hitTest调用时机是在事件传给它就会调用hitTest,并且通过pointInside判断点是否在它上面,如果在它上面就会将它的所有子控件都调用hitTest和pointInside继续查找。如果子控件没有找到那么它的父控件就是最适合的。
如果父控件不能接受触摸事件,那么子控件就不可能接收到触摸事件。

响应链

找到最适合的view,当view不能处理事件时会将事件传给它的下一个响应者处理,一直找不到能处理的对象,最终会传回UIApplication,如果UIApplication也不能处理那么此事件将被丢弃。
view 是否能处理事件,即看view是否重写了touches的方法。当view没有重写touches方法处理事件,则会直接super 调用touches方法传到下一个响应者。

代码测试 hittest执行顺序

图1点击c绿色中心位置

事件传递链 window -->a__hittest&pointinside___->b___hittest&pointinside____->c
注释:点击c事件会从UIApplication 传给window,window会执行hittest然后通过pointinside判断是在点击在window内,从而调用window上的子控件的hittest和pointinside,找到a将事件传递给a,a重复window的操作找到了c是最终的view,事件传递到了c。
注:扩大按钮响应方法可以重写pointInside

事件响应处理
重写按钮c的touches方法cAction不能响应事件被截获

注释:事件传递到最合适的view之后开始判断是否能响应处理事件,重写了c的touches方法c按钮本身设置的action就无法响应。响应链即是从view通过touches方法去响应,本身没有重写touches方法处理事件则通过super调用touches传递给父控件。这个传递过程就形成了响应链。

加上super touches c按钮本身action 可以响应

注:多对象处理事件就可以这么实现

demo-git

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • iOS | 事件传递及响应链 试想一下假如你是一台手机📟,当有人触摸了屏幕之后,你需要找到他具体触摸了什么东西,他...
    迷路卜阅读 211评论 0 0
  • 在iOS中,用户与APP进行交互,会产生很多事件,这些事件是如何产生,响应的链条又是怎样传递的,本文将会进行一番探...
    探索者的旅途阅读 738评论 0 1
  • iOS的应用中,用户与App进行交互,会产生很多事件,这些事件是如何产生,响应的链条又是怎样传递的呢,下面将会一一...
    limeng99阅读 625评论 1 1
  • 前言 看关于这方面的文章基本没有能涉及到UIGestureRecognizers相关的文章,因此决定写这样一篇文章...
    CodeRookie阅读 657评论 0 3
  • 一、事件传递机制 在iOS中,只有继承于UIResponder的子类,才可以处理事件。 1.当iOS程序中发生触摸...
    binya阅读 1,163评论 0 1