UIView中提供两个方法用来确定hit-testing View
hitTest:withEvent:方法的处理流程:
先调用pointInside:withEvent:判断触摸点是否在当前视图内;
如果返回YES,
该视图的所有子视图调用hitTest:withEvent,调用顺序由层级低到高依次调用。
如果返回NO,
hitTest:withEvent返回nil,该视图的所有子视图的分支全部被忽略。
备注:
如果View的同级别Subview中有重叠的部分,则优先检查顶部的Subview,如果顶部的Subview返回nil, 再检查底部的Subview。
如果点击没有发生在某View中,那么该事件就不可能发生在View的Subview中,如果你的Subview设置了clipsToBounds=NO,实际显示区域可能超出了superView的frame,你点击超出的部分,是不会处理你的事件的。
以下情况导致自身和其所有子视图不能被hit-testing发现,无法响应触摸事件:
1.隐藏(hidden=YES)的视图
2.禁止用户操作(userInteractionEnabled=NO)的视图
3.alpha<0.01的视图
4.视图超出父视图的区域