响应者链的事件分发

  响应者链的事件分发:从Window的视图开始分发向上传(向内部传),一定要分清楚谁是谁的子视图以及同级视图中他们的先后顺序,具体流程请看代码

//分发事件的方法

/*

 0.判断该点是否在视图内,如果不是返回nil

 1.遍历子视图(倒序)

 2.转换坐标系

 3.分发给子视图

 4.查看触摸点在不在子视图中 在的话子视图调用hitTest,如果有返回值,直接返回,循环结束,方法结束

 5.如果没有,返回self

 */

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

   

    NSLog(@"-----a");

  // 0.判断点 是否在本身的bounds内

  BOOL inside =  [self pointInside:point withEvent:event];

    if (!inside) {

        return nil;

    }

   //1.遍历子视图

    for (int i =(int)self.subviews.count-1;i>=0; i--) {

        //获取subView

        UIView *subView = [self.subviews objectAtIndex:i];

        //converPoint toView转换到子视图的坐标系

       CGPoint p = [self convertPoint:point toView:subView];

       

        //判断子视图的hitTest方法有没有返回值,如果没有返回值,继续循环

        UIView *view = [subView hitTest:p withEvent:event];

        

        if ([subView pointInside:p withEvent:event]) {

            if (view) {

                return view;

            }

        }

     }

  //5.r如果没有子视图,返回self

    return self;

}

 

原文地址:https://www.cnblogs.com/wen-1992/p/4760899.html