• 事件响应者链的工作原理


     

    iOS使用hit-testing寻找触摸的view。 Hit-Testing通过检查触摸点是否在关联的view边界内,如果在,则递归地检查该view的所有子view。在层级上处于lowest(就是离用户最近的view)且边界范围包含触摸点的view成为hit-test view。确定hit-test view后,它传递触摸事件给该view。

    官方小例子事件响应者链如下图所示:

    • 触摸点在view A中,所以要先检查子view B和C。
    • 触摸点不在view B中,但在C中,所以检查C的子view D和E。
    • 触摸点不在D中,但在E中。View E是这个层级上处于lowest的view的边界范围包含触摸点,所以它成为了hit-test view。

    Hit-test view是处理触摸事件的第一选择,如果hit-test view不能处理事件,该事件将从事件响应链中寻找响应器,直到系统找到一个处理事件的对象。若不能处理,则就有事件传递链了,继续看下面的事件传递链。

    事件传递链如下图所示:

    左半图:

    • initial view若不能处理事件,则传到其父视图view
    • view若不能处理,则传到其父视图,因为它还不是最上层视图
    • 这里view的父视图是view controller的view,因为这个view也不能处理事件,因此传给view controller
    • 若view controller也不能处理此事件,则传到window
    • 若window也不能处理此事件,则传到app单例对象Application
    • 若UIApplication单例对象也不能处理,则表示无效事件

    右半图:

    • initial view一直传递直到最上层view(原话:A view passes an event up its view controller’s view hierarchy until it reaches the topmost view.)
    • topmost view传递事件到它所在的控制器(原话:The topmost view passes the event to its view controller.)
    • view controller传递事件到topmost view的父视图,重复前三步,走到到达root controller(原话:passes the event to its topmost view’s superview. Steps 1-3 repeat until the event reaches the root view controller.)
    • 由root控制器传递事件到window(原话:The root view controller passes the event to the window object.)
    • 若window也不能处理此事件,则传到app单例对象Application
    • 若UIApplication单例对象也不能处理,则表示无效事件

    若要了解更多,参考官方文档吧:Event Handling Guide for iOS

  • 相关阅读:
    codevs 1202 求和
    codevs 1201 最小数和最大数
    nyist 240 小明的调查统计(二)
    nyist28大数阶乘
    nyist 626 intersection set
    【】小技巧】CSS文字两端对齐
    Vue.js项目模板搭建
    25个最基本的JavaScript面试问题及答案
    java抽象类与接口的区别及用法
    JQuery事件手册
  • 原文地址:https://www.cnblogs.com/caomeixiangni-324/p/5234833.html
Copyright © 2020-2023  润新知