美文网首页
简单概述iOS响应链和事件传递

简单概述iOS响应链和事件传递

作者: 代码歌 | 来源:发表于2020-11-23 11:12 被阅读0次

    文章末尾有两个开发中经常遇到问题的例子,不要错过哟~

    前提:

    UIView不接受事件处理的情况主要有以下三种
    1、alpha <0.01
    2、userInteractionEnabled = NO
    3、hidden = YES

    过程:

    当我们点击View D的位置时:系统调用 hitTest:withEvent: 方法寻找更合适的view,如果子控件是合适的view,则在子控件再调用hitTest:withEvent:查看子控件是不是合适的view,一直遍历,直到找到最合适的view。过程如下:

    1.触摸的CGPoint在View A上吗?在的,继续测试A的子视图View B、View C
    2.在View B上吗?不。在View C上吗?在,继续C的子视图View D、View E
    3.在View D上吗?不,且D无subview,结束此分支
    4.在View E上吗?在,E无subview,结束此分支
    5.结果形成了一个链,View A -->View C -->View E

    当View E无法处理此事件怎么办?按照响应链往上回溯即可,一直回溯到application,也无人处理此事件,则将事件【丢弃】。

    注意:所有的响应链都是父子视图的关系,如果View A、View C、 VIew E只是视觉上遮盖了,但是却不是superview、subview的关系,则事件是不会在两者之间传递的

    事件处理两个例子:

    如图:
    1、如果b的userInteractionEnabled为NO,给a添加UITapGestureRecognizer点击事件,点击b会响应a的点击事件吗?
    会。因为点击b发生触摸事件时,系统会从父控件进行遍历。因为a添加了点击事件,且b的userInteractionEnabled为NO,不接受事件处理。则系统认为a是适合处理事件的view。

    2、如果a的userInteractionEnabled为NO,给b添加UITapGestureRecognizer点击事件,点击b会响应自己的点击事件吗?
    不会。因为点击b发生触摸事件时,系统会从父控件进行遍历。作为b的父控件,如果a的userInteractionEnabled为NO,a不接受事件处理,则无法传递到b,所以b不响应

    相关文章

      网友评论

          本文标题:简单概述iOS响应链和事件传递

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