触摸事件的传递
触摸事件的传递是从父控件传递到子控件
如果父控件不能接收触摸事件,那么子控件就不可能接收到触摸事件
不能接受触摸事件的四种情况
不接收用户交互,即:userInteractionEnabled = NO
隐藏,即:hidden = YES
透明,即:alpha <= 0.01
未启用,即:enabled = NO
提示:UIImageView的userInteractionEnabled默认就是NO,因此UIImageView以及它的子控件默认是不能接收触摸事件的
如何找到最合适处理事件的控件:
首先,判断自己能否接收触摸事件
可以通过重写hitTest:withEvent:方法验证
其次,判断触摸点是否在自己身上
对应方法pointInside:withEvent:
从后往前(先遍历最后添加的子控件)遍历子控件,重复前面的两个步骤
如果没有符合条件的子控件,那么就自己处理
事件响应者链
如果当前view是控制器的view,那么就传递给控制器
如果控制器不存在,则将其传递给它的父控件
在视图层次结构的最顶层视图也不能处理接收到的事件或消息,则将事件或消息传递给UIWindow对象进行处理
如果UIWindow对象也不处理,则将事件或消息传递给UIApplication对象
如果UIApplication也不能处理该事件或消息,则将其丢弃
补充:如何判断上一个响应者
如果当前这个view是控制器的view,那么控制器就是上一个响应者
如果当前这个view不是控制器的view,那么父控件就是上一个响应者

网友评论