通过兄弟子视图传播触摸事件?
我有一堆子视图,都有用户交互部分(子)和全屏幕。 问题是,如果我触及堆栈顶部的一个非交互式部分,那么它将不会在堆栈的其余部分传播该触摸。 我的设置:
查看A – 查看B(全屏容器,本身不具有交互性,但具有交互式子视图)—-查看B1(交互式)—-查看B2(交互式) – 查看C(与B相同)—-查看C1(交互式)—-查看C2(交互式)
B和C都是全屏,但B1 / B2 / C1 / C2只是屏幕的一小部分。
[a addSubview:b]; [a addSubview:c];
如果我触摸C1 / C2以外的任何东西,我想要触摸事件来检查它是否碰到了B(B1 / B2)中的任何地方,而是只返回到A,然后返回到A的父亲。 是否有可能做到这一点? 如果我在C上设置了userInteractionEnabled NO,但在C1 / C2上设置了YES,它也不会收到任何对内部的调用,尽pipe在这种情况下,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]; }
一种可能性是重写
- (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; } }
事件沿着从子级到父级的视图层次结构传播(正如您发现的那样)。 所以我有两种可能性:
使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 }