hitText和pointInside
最近准备看点HTML5的东西,时间有点少,写一点简单的东西吧
介绍两个方法
// 用于拦截点击方法,使不能交互的视图出现交互效果
// 事件传递的时候使用
// 当事件传递给控件的时候调用
// 寻找最合适的View进行处理,倒叙遍历
// point:当前的触摸点,point的这个坐标系就是方法的调用者
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 调用系统的做法去寻找最合适的view,返回最合适的view
UIView *fitView = [super hitTest:point withEvent:event];
return fitView;
}
// 作用:判断当前这个点在不在方法调用者(控件)上
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
return YES;
}
这两个方法一般配合使用
底层实现
// 点击视图 -》 事件 -》 UIApplication -> UIWindow
// 因为所有的视图类都是继承BaseView
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 1.判断当前控件能否接收事件
if (self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) return nil;
// 2. 判断点在不在当前控件
if ([self pointInside:point withEvent:event] == NO) return nil;
// 3.从后往前遍历自己的子控件
NSInteger count = self.subviews.count;
for (NSInteger i = count - 1; i >= 0; i--) {
UIView *childView = self.subviews[i];
// 把当前控件上的坐标系转换成子控件上的坐标系
CGPoint childP = [self convertPoint:point toView:childView];
UIView *fitView = [childView hitTest:childP withEvent:event];
if (fitView) { // 寻找到最合适的view
return fitView;
}
}
// 循环结束,表示没有比自己更合适的view
return self;
}
举个简单的应用例子
需求:
一个视图被一个蒙版挡住了,我们需要通过蒙版点击这个视图
-
(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
// 当前坐标系上的点转换到按钮上的点
CGPoint btnP = [self convertPoint:point toView:self.btn];// 判断点在不在按钮上
if ([self.btn pointInside:btnP withEvent:event]) {
// 点在按钮上
return self.btn;
}else{
return [super hitTest:point withEvent:event];
}
}
哦了.这种情况很常见的,自己体会喽