iOS事件产生传递 与 响应的规则

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]; 如果不覆盖,就会调用父类的。

你可能感兴趣的:(iOS事件产生传递 与 响应的规则)