事件的传递和响应

事件的传递

  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张图片

事件处理的整个流程

  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

你可能感兴趣的:(事件的传递和响应)