iOS事件产生传递 和 事件响应,充分的体现了 “子控件优先” 这一特征。
1.发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件“队列”中。
2.UIApplication会从事件“队列”中取出最前⾯的事件,交给主窗⼝(keyWindow).
3.调用主窗口的hitTest和pointInside方法,以找到⼀个最合适的视图,来处理触摸事件(调用touchesMove等方法)。
//hitTest方法的底层实现:
//作用:去寻找最适合的View
//什么时候调用:首先调用的是keyWindow的hitTest方法,再向子控件传递
//返回值:返回的是谁,谁就是最适合的View。
-(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;
}
4.touchesMove等方法的默认实现是[super touchesMove]; 如果不覆盖,就会调用父类的。