繁体   English   中英

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

[英]iphone/ipad - parent UIView is blocking touches from getting to subviews - why?

我有一个UIView,它有一堆子视图。 子视图应该能够接收触摸事件,但由于某种原因,父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在我在主UIWindow中收听时会得到触摸事件:

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

但为什么在这个世界上我不能让子视图接受接触? 我不明白为什么有时会发生这种情况。 我没有改变mainView的任何默认属性。

与父视图的框架有关。 如果框架未包含子视图,则它们将不会接收到触摸。

UIView触摸不会传递给子视图,如果它们位于解决方案所提到的超视图范围之外。

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

事件传递文档

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

  1. 创建UIView(或其他UIView子类)的子类。
  2. 覆盖hitTest:withEvent。
  3. 使用此UIView子类作为超级视图,因此子视图可以响应触摸。

在子类中添加以下方法:

(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];
}

注意:从子视图开始使用的反向枚举器是从后到前排序的,我们希望首先测试最前面的视图。

你是否触摸处理程序调用超类处理程序?

例如,在你的触摸开始,打电话:

[super touchesBegan:touches withEvent:event];

暂无
暂无

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

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