0

我有一个响应触摸的大 UIView,它上面覆盖着许多对触摸做出不同响应的小 UIView。是否可以触摸屏幕上的任何位置并四处滑动,并让每个视图都知道它是否被触摸?

例如,我将手指放在左上角,然后向右下角滑动。touchesBegan/Moved 由 baseView 收集。当我通过 itemView1、itemView2 和 itemView3 时,控制权传递给它们。如果我在 itemView2 上抬起手指,它会执行 itemView2 的 touchesEnded 方法。如果我没有将手指放在任何项目上,它就会执行 baseView 的 touchesEnded。

目前,如果我在 baseView 上触碰,touchEnded 始终是 baseView,更高的 itemViews 将被忽略。

有任何想法吗?

4

2 回答 2

1

如果我理解正确,则检测到touchesEnded 事件,但不是由需要了解它的子视图检测到。我认为这可能对你有用:

在一个通用文件中,将 TOUCHES_ENDED_IN_SUPERVIEW 定义为 @"touches end in superview"。

在触发的包含视图的 touchesEnded 方法中添加

[[NSNotificationCenter defaultCenter] postNotificationName:  TOUCHES_ENDED_IN_SUPERVIEW object: self];

在子视图的 touchesBegan 中,添加

[[NSNotificationCenter defaultCenter] addObserver: self 
    selector: @selector(touchesEnded:) 
    name: TOUCHES_ENDED_IN_SUPERVIEW 
    object: self.superview]; 

在子视图的 touchesEnded 方法中,对事件使用您的正常逻辑,并添加

[[NSNotificationCenter defaultCenter] removeObserver: self name: TOUCHES_ENDED_IN_SUPERVIEW object: self.superview];

记得把 [[NSNotificationCenter defaultCenter] removeObserver: self] 放在你的 dealloc 中,以防在没有收到 touchesEnded 事件的情况下离开页面。

您可能希望通知将其消息发送到一个特殊的 touchesEndedInSuperview 方法,该方法将调用 touchesEnded 本身,但这取决于在这种情况下您是否需要进行任何特殊处理。

于 2009-08-17T12:45:59.803 回答
0

你可以使用这样的东西:


-(void)touchesEnded: (NSSet *)touches
          withEvent: (UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView: touch.view];
    if (CGRectContainsPoint(control1.frame, location)) {
        [self control1Action];
    } else if (CGRectContainsPoint(control2.frame, location)) {
        [self control2Action];
    }
}
于 2011-02-23T20:48:32.607 回答