美文网首页笔试&&面试经验校招备战笔记牛客网 iOS 练习题
简述iOS系统中的触屏事件分发及响应流程

简述iOS系统中的触屏事件分发及响应流程

作者: iOS佥 | 来源:发表于2018-06-25 16:00 被阅读2次

    简述iOS系统中的触屏事件分发及响应流程

    本文转载自 CocoaChina 作者:alvin_wang
    更详细说明可以参考 <简书 — 刘小壮> https://www.jianshu.com/p/b0884faae603

    所有继承响应者对象UIResponder都能接收并处理事件。按照时间顺序,先找到到最合适的view,然后就会调用view的touches方法,这些方法的默认做法是将事件顺着响应这链条向上传递,将事件交由上一个响应者进行处理,直到有一个view能处理该响应为止或者丢弃。这是一个从上到下,再从下到上的过程。

    1.事件的产生

    • 发生事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中。
    • UIApplication会从事件队列中取出最前面的事件,并将该事件分发下去处理。通常,先发送事件给应用程序的主窗口(keywindow)。
    • keywindow会在视图层次结构中找到一个最合适的视图来处理事件。

    2.事件的传递

    • 事件的传递先从父控件传递到子控件(UIApplication->window->寻找处理事件最合适的view)。
    • 如果父view不能接受触摸事件,那么子view也不能接收到触摸事件。

    2.1 如何找到最合适的view来处理事件

    • 判断keywindow自己是否接受事件

    • 判断事件是否在自己身上

    • 子view数组中从后往前遍历子控件,重复前面1,2步骤

    • 如果没有合适的子控件,那自己就是最合适的控件

    2.2 寻找最合适的view底层剖析

    有两个重要的方法:

    hitTest:withEvent:
    pointInside:withEvent:
    

    view会调用hitTest:withEvent:方法,hitTest:withEvent:方法底层会调用pointInside:withEvent:方法判断触摸点是不是在这个view的坐标系上。如果在坐标系上,会分发事件给这个view的子view。然后每个字view重复以上步骤,直至最底层的一个合适的view。

    3.事件的响应

    事件响应会先从底层最合适的view开始,然后随着上一步找到的链一层一层响应touch事件。默认touch事件会传递给上一层。如果到了viewcontroller的view,就会传递给viewcontroller。如果viewcontroller不能处理,就会传递给UIWindow。如果UIWindow无法处理,就会传递给UIApplication。如果UIApplication无法处理,就会传递给UIApplicationDelegate。如果UIApplicationDelegate不能处理,则会丢弃该事件。

    简述iOS系统中的触屏事件分发及响应流程

    本文转载自 CocoaChina 作者:alvin_wang
    更详细说明可以参考 <简书 — 刘小壮> https://www.jianshu.com/p/b0884faae603

    所有继承响应者对象UIResponder都能接收并处理事件。按照时间顺序,先找到到最合适的view,然后就会调用view的touches方法,这些方法的默认做法是将事件顺着响应这链条向上传递,将事件交由上一个响应者进行处理,直到有一个view能处理该响应为止或者丢弃。这是一个从上到下,再从下到上的过程。

    1.事件的产生

    • 发生事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中。
    • UIApplication会从事件队列中取出最前面的事件,并将该事件分发下去处理。通常,先发送事件给应用程序的主窗口(keywindow)。
    • keywindow会在视图层次结构中找到一个最合适的视图来处理事件。

    2.事件的传递

    • 事件的传递先从父控件传递到子控件(UIApplication->window->寻找处理事件最合适的view)。
    • 如果父view不能接受触摸事件,那么子view也不能接收到触摸事件。

    2.1 如何找到最合适的view来处理事件

    • 判断keywindow自己是否接受事件

    • 判断事件是否在自己身上

    • 子view数组中从后往前遍历子控件,重复前面1,2步骤

    • 如果没有合适的子控件,那自己就是最合适的控件

    2.2 寻找最合适的view底层剖析

    有两个重要的方法:

    hitTest:withEvent:
    pointInside:withEvent:
    

    view会调用hitTest:withEvent:方法,hitTest:withEvent:方法底层会调用pointInside:withEvent:方法判断触摸点是不是在这个view的坐标系上。如果在坐标系上,会分发事件给这个view的子view。然后每个字view重复以上步骤,直至最底层的一个合适的view。

    3.事件的响应

    事件响应会先从底层最合适的view开始,然后随着上一步找到的链一层一层响应touch事件。默认touch事件会传递给上一层。如果到了viewcontroller的view,就会传递给viewcontroller。如果viewcontroller不能处理,就会传递给UIWindow。如果UIWindow无法处理,就会传递给UIApplication。如果UIApplication无法处理,就会传递给UIApplicationDelegate。如果UIApplicationDelegate不能处理,则会丢弃该事件。

    image

    相关文章

      网友评论

        本文标题:简述iOS系统中的触屏事件分发及响应流程

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