UITouch事件的传递和使用

直接上代码吧,该方法在UIView的.m里面

传递方法

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    
    //判断点击的位置是否在RootView内部
    if (![self pointInside:point withEvent:event]) {
        return nil;
    }
 //获取所有的子视图
    NSArray *subViews = self.subviews;
    //遍历(从后到前)数组,依次判断每一个视图的情况
    for (NSInteger i = subViews.count - 1; i >= 0; i--) {
        //获取其中一个视图
        UIView *view = subViews[i];
        //隐藏视图(几乎完全透明的视图)不参与用户事件的分配
        if (view.hidden == YES || view.userInteractionEnabled == NO || view.alpha <= 0.001) {
            //跳过此视图的判断,直接进行下一个视图的判断
            continue;
        }
        //判断坐标点在不在视图之内
        //坐标系转换
        CGPoint pointForView = [self convertPoint:point toView:view];
        if ([view pointInside:pointForView withEvent:event]) {
            //当确定某一子视图接收到事件后,还需要让这个子视图再进行分配
            return [view hitTest:pointForView withEvent:event];
        }
    }
    
    //如果不在任意一个子视图中,则说明由RootView来接受事件
    return self;

使用方法

使用响应者链可以找到该视图的navigationcontroller然后跳转进去

- (UINavigationController *)navigationController {
    
    UIResponder *responder = self.nextResponder;
    while (responder) {
        //NSLog(@"%@", responder);
        if ([responder isKindOfClass:[UINavigationController class]]) {
            return (UINavigationController *)responder;
        }
        responder = responder.nextResponder;
    }
    
    return nil;
}

你可能感兴趣的:(UITouch事件的传递和使用)