通过同级子视图传播触摸事件?(Propagating touch events through si

2019-08-31 09:53发布

我有一个都具有用户互动栏目(儿童)和所有全屏子视图的堆栈。 问题是,如果我降落在在堆栈的顶部的非交互部分,它不会再传播整个堆栈的其余部分是触摸。 我的设置:

视图A --view B(全屏幕的容器,而不是本身交互但具有交互式子视图)----视图B1(交互式)----视图B2(交互式)--view C(与B相同)----视图C1(交互式)----视图C2(交互式)

B和C均为全屏,但B1 / B2 / C1 / C2是只有屏幕的小部分。

[a addSubview:b];
[a addSubview:c];

如果我碰任何东西C1 / C2之外,我想触摸事件,然后检查,如果它击中B(B1 / B2)的内的任意位置,而是它只是追溯到A,然后到A的母公司。 是否有可能做到这一点? 如果我设置userInteractionEnabled NO在C,但在是C1 / C2,它不会给那些内任何电话或者,虽然在这种情况下,则B会得到触摸,符合市场预期。

编辑:截至向上穿越视图栈手动检查仅适用于某些子视图,而不是所有的人:

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

    if (self != self.topCustomViewsContainer) {     
        for (UIView *v in self.createdSubviews) {
            CGPoint newPoint = point;
            newPoint.x -= v.frame.origin.x;
            newPoint.y -= v.frame.origin.y;
            UIView *hit = [v hitTest:newPoint withEvent:event];
            if (hit)
                return hit;
        }
        return nil;

    }

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

Answer 1:

一种可能性是覆盖

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

方法鉴于B.你可以把它返回只有当B的子视图被击中。 试着这样说:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
  UIView *hitView = [super hitTest:point withEvent:event];
  if (hitView == self) {
    return nil;
  } else {
    return hitView;
  }
}


Answer 2:

活动传播了从小孩到父视图层次结构(如你发现)。 所以两种可能性发生的对我说:

使C B的孩子他们都具有相同的大小,和C显然已经有一个透明的背景,所以将其添加到B使用[viewB bringSubviewToFront:viewC]使其成为第一个获得触摸。 凡是不捕捉将传递到视图它的下面,然后由家长A.

或者:手动捕获触摸,并迫使他们在查看B(C的兄弟姐妹)。 这涉及您的视图控制器类实现这个

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [viewC touchesBegan:touches withEvent:event];
    // Note this could be in sibling B or in parent A, depending on which
    // has a reference to the 'viewC' object
}


文章来源: Propagating touch events through sibling subviews?