定制hitTest:withEvent:方法

hitTest:withEvent:方法的处理流程如下:

首先调用当前视图的pointInside:withEvent:方法判断触摸点是否在当前视图内;

若返回NO,则hitTest:withEvent:返回nil;

若返回YES,则向当前视图的所有子视图(subviews)发送hitTest:withEvent:消息,所有子视图的遍历顺序是从top到bottom,即从subviews数组的末尾向前遍历,直到有子视图返回非空对象或者全部子视图遍历完毕;

若第一次有子视图返回非空对象,则hitTest:withEvent:方法返回此对象,处理结束;

如所有子视图都返回非,则hitTest:withEvent:方法返回自身(self)。

hitTest:withEvent:方法忽略隐藏(hidden=YES)的视图,禁止用户操作(userInteractionEnabled=NO)的视图,以及alpha级别小于0.01(alpha<0.01)的视图。

例子

1.在此例子中button,scrollview同为topView的子视图,但scrollview覆盖在button之上,这样在button上的触摸操作返回的hit-test view为scrollview,button无法响应,可以修改topView的hitTest:withEvent:方法如下:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {

UIView *result = [super hitTest:point withEvent:event];

CGPoint buttonPoint = [underButton convertPoint:point fromView:self];

if ([underButton pointInside:buttonPoint withEvent:event]) {

return underButton;

}

return result;

}

这样如果触摸点在button的范围内,返回hittestView为button,从button按钮可以响应点击事件。

2.下图解决  点击导航栏下方也会触发导航栏按钮的点击事件


定制hitTest:withEvent:方法_第1张图片

你可能感兴趣的:(定制hitTest:withEvent:方法)