事件的传递和响应

作者: 鱼与愚七 | 来源:发表于2017-02-17 11:15 被阅读58次

    事件的传递

    1. 当产生触摸事件时, 触摸事件会被添加到由UIApplication管理的事件队列中
    2. UIApplication会从事件队列中取出最前面的事件, 把事件传递给应用程序的主窗口(keyWindow)
    3. 窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件, 主要就会调用hitTest:withEvent:pointInside方法

    事件的响应

    触摸事件的整体过程

    1. 产生触摸事件
    2. 事件开始传递
    3. 找到最合适的视图控件来处理事件
    4. 调用控件相应的touch方法处理具体的事件
    5. touch方法默认的做法是将事件顺着响应者链条向上传递(touch方法默认不处理时间, 只传递事件), 将事件交给上一个响应者进行处理

    响应者链条

    • 由继承自UIResponder的对象称为响应者对象, 而多个响应者对象连接起来的链条就是响应者链条
    • 作用: 能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理

    如何判断上一个响应者

    1. 如果当前view是控制器的view, 控制器就是上一个响应者
    2. 如果当前view不是控制器的view, 父控件就是上一个响应者

    响应者链的事件传递过程

    1. 如果当前view是控制器的view, 控制器就是上一个响应者, 事件传递给控制器; 如果当前view不是控制器的view, 父控件就是上一个响应者, 事件传递给父控件
    2. 视图层级中最顶级的试图也不能处理事件, 则传递给window对象
    3. window对象不能处理, 传递给UIApplication对象
    4. UIApplication对象也不能处理, 则丢弃

    事件处理的整个流程

    1. 当产生触摸事件时, 触摸事件会被添加到由UIApplication管理的事件队列中
    2. UIApplication会从事件队列中取出最前面的事件, 把事件传递给应用程序的主窗口(keyWindow)
    3. 窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件, 主要就会调用hitTest:withEvent:pointInside方法
    4. 最合适的视图会调用自己的touch方法处理事件
    5. touch方法默认把事件顺着响应者链条向上抛

    事件传递和响应的区别

    • 事件的传递是从上至下(父控件到子控件), 事件的响应是从下到上(顺着响应者链条向上传递: 子控件到父控件)

    UIView不能接收触摸事件的三种情况

    1. 不允许交互:userInteractionEnabled = NO
    2. 隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
    3. 透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度. alpha:0.0~0.01为透明

    注意: 默认UIImageView不能接受触摸事件,因为不允许交互,即userInteractionEnabled = NO,所以如果希望UIImageView可以交互,需要userInteractionEnabled = YES

    相关文章

      网友评论

        本文标题:事件的传递和响应

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