iphone/ipad-父UIView阻止触摸访问子视图-为什么?

iphone/ipad-父UIView阻止触摸访问子视图-为什么?,iphone,ipad,uiview,touch,subview,Iphone,Ipad,Uiview,Touch,Subview,我有一个UIView,它有一堆子视图。子视图应该能够接收触摸事件,但由于某些原因,父视图接收触摸,而不传递。我以非常标准的方式创建了它,就像我总是创建视图一样: UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)]; self.mainView = myView; [myView release]; [self.view addSubview:self.mainView]; 然

我有一个UIView,它有一堆子视图。子视图应该能够接收触摸事件,但由于某些原因,父视图接收触摸,而不传递。我以非常标准的方式创建了它,就像我总是创建视图一样:

UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,1024,768)];
    self.mainView = myView;
    [myView release];

    [self.view addSubview:self.mainView];
然后创建子视图,并将其作为普通视图添加:

[self.mainView addSubview:someOtherView];
当我在主窗口中收听时,我知道self.mainView正在获取触摸事件:

VIEW: <UIView: 0x8d34aa0; frame = (0 0; 1024 768);

视图:是否触摸处理程序调用超类处理程序

e、 g.在触摸中,开始呼叫:

[super touchesBegan:touches withEvent:event];

与父视图的框架有关。如果框架没有封闭子视图,它们将不会收到接触。

UIView接触不会传递到子视图,如果它们位于解决方案中提到的superview边界之外

但是,如果希望这些子视图响应触摸,请覆盖superview的
hitTest:withEvent:

触摸事件。窗口对象使用命中测试和响应器链来查找接收触摸事件的视图。在命中测试中,窗口在视图层次结构的最顶部视图上调用hitTest:withEvent:;此方法通过递归调用视图层次结构中返回YES的每个视图上的pointInside:withEvent:继续执行层次结构,直到找到发生触摸的子视图。该视图将成为命中测试视图

  • 创建UIView的子类(或其他UIView子类)
  • 覆盖hitTest:withEvent
  • 将此UIView子类用作superview,以便子视图可以响应触摸
  • 在子类中添加以下方法:

    (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
    {
        NSEnumerator *reverseE = [self.subviews reverseObjectEnumerator];
        UIView *iSubView;
    
        while ((iSubView = [reverseE nextObject])) {
    
            UIView *viewWasHit = [iSubView hitTest:[self convertPoint:point toView:iSubView] withEvent:event];
            if(viewWasHit) {
                return viewWasHit;
            }
    
        }
        return [super hitTest:point withEvent:event];
    }
    

    注意:使用反向枚举器,因为子视图是从后向前排序的,我们想先测试最前面的视图。

    我没有任何触摸处理程序。子视图只是不响应触摸。例如,其中一个子视图上的手势识别器不起作用。在屏幕上定位子视图时,请记住参考父视图的“边界”。你的画面可能是屏幕上的实际位置,也可能不是。@sol:你怎么知道是不是这样?