首页 > 代码库 > ios开发事件处理之 四:hittest方法的底层实现与应用
ios开发事件处理之 四:hittest方法的底层实现与应用
#import "XMGWindow.h"/** 1:注意点:hitTest方法内部会调用pointInside方法,询问触摸点是否在自己身上,当遍历子控件时,传入的坐标点要进行转化,将父视图上的坐标点转换到所要传递的子视图上的坐标点 2:hitTest的底层实现:当控件接收到触摸事件的时候,不管能不能处理事件,都会调用hitTest方法,此方法的底层实现是:1:先看自己是否能接受触摸事件 2:再看触摸点是否在自己身上 3:从后往前遍历子控件,拿到子控件后,再次重复1,2步骤,要把父控件上的坐标点转换为子控件坐标系下的点,再次执行hitTest方法。 3:若是最后还没有找到合适的view,那么就return self,自己就是合适的view */@implementation XMGWindow//作用:去寻找最适合的View//什么时候调用:当一个事件传递给当前View,就会调用.//返回值:返回的是谁,谁就是最适合的View(就会调用最适合的View的touch方法)-(UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event{ //1.判断自己能否接收事件 if(self.userInteractionEnabled == NO || self.hidden == YES || self.alpha <= 0.01) { return nil; } //2.判断当前点在不在当前View. if (![self pointInside:point withEvent:event]) { return nil; } //3.从后往前遍历自己的子控件.让子控件重复前两步操作,(把事件传递给,让子控件调用hitTest) int count = (int)self.subviews.count; for (int i = count - 1; i >= 0; i--) { //取出每一个子控件 UIView *chileV = self.subviews[i]; //把当前的点转换成子控件坐标系上的点. CGPoint childP = [self convertPoint:point toView:chileV]; UIView *fitView = [chileV hitTest:childP withEvent:event]; //判断有没有找到最适合的View if(fitView){ return fitView; } } //4.没有找到比它自己更适合的View.那么它自己就是最适合的View return self; }//作用:判断当前点在不在它调用View,(谁调用pointInside,这个View就是谁)//什么时候调用:它是在hitTest方法当中调用的.//注意:point点必须得要跟它方法调用者在同一个坐标系里面-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event{ NSLog(@"%s",__func__); return YES;}@end
ios开发事件处理之 四:hittest方法的底层实现与应用
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。