不是任何对象都能处理事件,只有继承了UIResponder的对象才能接受并处理事件,称之为"响应者对象"。
- UIApplication
- UIViewController
- UIView
事件传递:
- 触摸事件的传递是从父控件传递到子控件
- 也就是UIApplication -> Window -> 寻找处理事件最合适的view
由此,如果父控件不能接受触摸事件,那么子控件就不能接受到触摸事件
如何找到最合适的控件来处理事件?
- 自己是否接受触摸事件
- 触摸点是否在自己身上
- 从后往前遍历子控件数组,重复前面的两个步骤
- 如果没有符合条件的子控件,那么就是自己
UIView不能接受触摸事件的三种情况:
- 不允许交互 userInteractionEnabled = NO
- 隐藏 如果父控件隐藏,它的子控件也会隐藏,隐藏的控件不能接受事件
- 透明度 控件的透明度小于等于0.01不接受触摸事件
事件传递给谁,就会调用谁的hitTest:withEvent:方法
事件的传递顺序:
产生触摸事件 -> UIApplication事件队列 -> [UIWindow hitTest:withEvent:] -> 返回更合适的view -> [子控件hitTest:withEvent:] -> 返回最合适的view
响应者对象: 能处理事件的对象,也就是继承自UIResponder的对象
经过多个响应者对象的传递,找到合适的响应视图,这多个响应者对象连接起来的链条,称之为响应者链。
如何判断下一个响应者(nextResponder):
- 如果当前view是控制器的view,那么view的下一个响应者就是控制器
- 如果当前view不是控制器的view,那么view 的下一个响应者是它的父控件
事件的传递和响应的区别
事件的传递是从上到下(父控件到子控件), 事件的响应是从下到上(沿着响应者链条向上传递,子控件到父控件)
网友评论