hitTest:withEvent应用:(hitTest可实现击穿点击)
1)
父视图中有布局重叠的且都可响应用户操作的对象,如:ScrollView and
Button,如果Button在ScrollView下面,正常情况下Button是不会成为第一响应者的,如果想让Button可以响应在其布局内的
触摸事件,可以在Button和ScrollView的父View中重写hitTest:withEvent方法
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
CGPoint hitPoint = [_testButton convertPoint:point fromView:self];
if([_testButton pointInside:hitPoint withEvent:event])
return_testButton;
return[superhitTest:point withEvent:event];
}//_testButton是指定响应对象的 弱 引用
2)UIView的子类不响应触摸事件,但其子View可以响应。通过设置userInteractionEnabled=NO,可以使UIView子类不响应触摸事件,但其会挟持子View,原因见3)
这时,可以通过重写hitTest:withEvent来实现:
-(id)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
idhitView = [superhitTest:point withEvent:event];
if(hitView ==self)returnnil;
elsereturnhitView;
}
3)
userInteractionEnabled =
NO的作用:使当前的hitTest:withEvent返回nil,其它的类似属性还有:Hidden=YES,alpha<0.01,
(UIControl中Enabled=NO??),事件发生的点在子View的几何范围内,却超过了父View的几何范围
(clipsToBounds=NO时可出现此种情况)