忽略对背景(超级)视图的触摸

时间:2009-07-08 22:11:34

标签: iphone cocoa-touch uiview uiviewcontroller

我应该如何处理,或者更确切地说不处理(忽略),触及我的背景视图?它恰好是我的视图控制器的视图,它具有我想要响应触摸事件的子视图(对象)。为视图设置userInteractionEnabled = NO似乎也会关闭子视图的所有交互。

我正在测试

if ([[touch view] superview] == self.view) 

在touchesBegan / Moved / Ended中。但我正试图消除一些条件测试,以寻找更好的方法......

2 个答案:

答案 0 :(得分:2)

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;递归调用-pointInside:withEvent:。 point是帧坐标

如果你在后台视图中覆盖它,你可以指定哪个子视图被击中 - 你可以懒惰,只要询问每个子视图是否会返回是,并且永远不会返回自己(如果它们都返回则返回nil零)。类似的东西:

UIView *hitView = nil;
NSArray *subviews = [self subviews];
int subviewIndex, subviewCount = [subviews count];
for (int subviewIndex = 0; !hitView && subviewIndex < subviewCount; subviewIndex++) {
    hitView = [[subviews objectAtIndex:subviewIndex] hitTest:point withEvent:event];
}
return hitView;

答案 1 :(得分:2)

感谢Dan的回答,也是一个很好的问题。

然而,接受的答案有一个错误:hitTesting子视图应该用转换为子视图的点完成。 此外,subviewIndex已在'for'之前定义。

由于子视图是根据z索引排序的,因此迭代应该从最后一个到第一个(参见Event handling for iOS - how hitTest:withEvent: and pointInside:withEvent: are related?How to get UIView hierarchy index ??? (i.e. the depth in between the other subviews))。

这是更新后的代码:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *hitView = nil;
    NSArray *subviews = [self subviews];
    int subviewIndex, subviewCount = [subviews count];
    for (subviewIndex = subviewCount-1; !hitView && subviewIndex >= 0; subviewIndex--) {
        UIView *subview = [subviews objectAtIndex:subviewIndex];
        hitView = [subview hitTest:[self convertPoint:point toView:subview] withEvent:event];
    }
    return hitView;
}