3

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

我目前正在测试

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

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

4

2 回答 2

2

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event;递归调用-pointInside:withEvent:. 点在框架坐标中

如果你在你的背景视图中覆盖它,你可以指定哪个子视图被击中 - 你可以很懒惰,只是询问你的每个子视图是否会返回是,并且永远不要返回自己(如果它们都返回 nil,则返回 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;
于 2009-07-08T22:27:36.213 回答
2

感谢丹的回答,这个问题也很好。

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

由于子视图是根据它们的 z 索引排序的,因此迭代应该从最后一个到第一个(请参阅iOS 的事件处理 - hitTest:withEvent: 和 pointInside:withEvent: 如何相关?以及如何获取 UIView 层次索引??? (即其他子视图之间的深度))。

这是更新的代码:

- (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;
}
于 2013-02-25T18:56:35.720 回答