繁体   English   中英

接收触摸事件以进行子视图

[英]Receive touch event for subview

我有BooksEAGLView ,它具有用于接收触摸事件的UIButton 然后我的目的是增强现实叠加,我将叠加视图添加到BooksEAGLView然后我的按钮没有收到触摸事件。

我如何获得两个视图的触摸事件。

bookOverlayController = [[BooksOverlayViewController alloc]initWithDelegate:self];

 // Create the EAGLView
 eaglView = [[BooksEAGLView alloc] initWithFrame:viewFrame delegate:self appSession:vapp];
 [eaglView addSubview:bookOverlayController.view];
 [self setView:eaglView];

 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
 return ([touch.view.superview isKindOfClass:[BooksEAGLView class]] || [touch.view.superview isKindOfClass:[TargetOverlayView class]]);
 }

触摸事件:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    NSLog(@"hitTest:withEvent called :");
    NSLog(@"Event: %@", event);
    NSLog(@"Point: %@", NSStringFromCGPoint(point));
    NSLog(@"Event Type: %d", event.type);
    NSLog(@"Event SubType: %d", event.subtype);
    NSLog(@"---");

    return [super hitTest:point withEvent:event];
}

好的,我专门为您做了示例项目。 这是我做的:

  • 子类化UIView类并创建CustomView。
  • 在“身份检查器”部分的情节提要中,将视图的“类”设置为CustomView

在此处输入图片说明

在屏幕截图上,您可能会注意到视图层次结构,它重复了您的概念。

这是在CustomView.m中覆盖的hitTest:withEvent

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    if (!self.clipsToBounds && !self.hidden && self.alpha > 0) {
        for (UIView *subview in self.subviews.reverseObjectEnumerator) {
            CGPoint subPoint = [subview convertPoint:point fromView:self];
            UIView *result = [subview hitTest:subPoint withEvent:event];
            if (result != nil && [result isKindOfClass:[UIButton class]]) {
                return result;
            }
        }
    }

    return [super hitTest:point withEvent:event];
}

此方法通过调用每个子视图的pointInside:withEvent:方法来遍历视图层次结构,以确定哪个子视图应接收触摸事件。 如果pointInside:withEvent:返回YES ,则将遍历子视图的层次结构,直到找到包含指定点的最前面的视图。 如果视图不包含该点,则将忽略其视图层次结构的分支。 您很少需要自己调用此方法,但是您可以重写此方法以从子视图中隐藏触摸事件 此方法将忽略隐藏的视图对象,禁用的用户交互或alpha级别小于0.01的视图对象。 确定命中时,此方法不考虑视图的内容。 因此,即使指定点位于该视图内容的透明部分中,该视图仍然可以返回。

在甜点上示例项目

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM