事件的传递
- 当产生触摸事件时, 触摸事件会被添加到由UIApplication管理的事件队列中
- UIApplication会从事件队列中取出最前面的事件, 把事件传递给应用程序的主窗口(keyWindow)
- 窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件, 主要就会调用
hitTest:withEvent:
和pointInside
方法
事件的响应
触摸事件的整体过程
- 产生触摸事件
- 事件开始传递
- 找到最合适的视图控件来处理事件
- 调用控件相应的touch方法处理具体的事件
- touch方法默认的做法是将事件顺着响应者链条向上传递(touch方法默认不处理时间, 只传递事件), 将事件交给上一个响应者进行处理
响应者链条
- 由继承自UIResponder的对象称为响应者对象, 而多个响应者对象连接起来的链条就是响应者链条
- 作用: 能很清楚的看见每个响应者之间的联系,并且可以让一个事件多个对象处理
如何判断上一个响应者
- 如果当前view是控制器的view, 控制器就是上一个响应者
- 如果当前view不是控制器的view, 父控件就是上一个响应者
响应者链的事件传递过程
- 如果当前view是控制器的view, 控制器就是上一个响应者, 事件传递给控制器; 如果当前view不是控制器的view, 父控件就是上一个响应者, 事件传递给父控件
- 视图层级中最顶级的试图也不能处理事件, 则传递给window对象
- window对象不能处理, 传递给UIApplication对象
- UIApplication对象也不能处理, 则丢弃
事件处理的整个流程
- 当产生触摸事件时, 触摸事件会被添加到由UIApplication管理的事件队列中
- UIApplication会从事件队列中取出最前面的事件, 把事件传递给应用程序的主窗口(keyWindow)
- 窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件, 主要就会调用
hitTest:withEvent:
和pointInside
方法 - 最合适的视图会调用自己的
touch
方法处理事件 -
touch
方法默认把事件顺着响应者链条向上抛
事件传递和响应的区别
- 事件的传递是从上至下(父控件到子控件), 事件的响应是从下到上(顺着响应者链条向上传递: 子控件到父控件)
UIView不能接收触摸事件的三种情况
- 不允许交互:userInteractionEnabled = NO
- 隐藏:如果把父控件隐藏,那么子控件也会隐藏,隐藏的控件不能接受事件
- 透明度:如果设置一个控件的透明度<0.01,会直接影响子控件的透明度. alpha:0.0~0.01为透明
注意: 默认UIImageView不能接受触摸事件,因为不允许交互,即userInteractionEnabled = NO,所以如果希望UIImageView可以交互,需要userInteractionEnabled = YES