我可以检测是否触摸了更高的子视图?

时间:2009-08-17 10:16:57

标签: iphone objective-c cocoa-touch uitouch

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

例如,我将手指放在左上方并向右下方滑动。 touchesBegan / Moved由baseView收集。当我传递itemView1,itemView2和itemView3时,控件传递给它们。如果我在itemView2上抬起手指,它会执行itemView2的touchesEnded方法。如果我将手指抬到任何一个项目上,它就会执行baseView的touchesEnded。

目前,如果我触及baseView,touchEnded始终是baseView,而忽略更高的itemViews。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,会检测到touchesEnded事件 ,但不会被需要了解它的子视图检测到。我认为这可能适合你:

在一个公共文件中,将TOUCHES_ENDED_IN_SUPERVIEW定义为@“触摸在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];

请记住在您的dealloc中放置[[NSNotificationCenter defaultCenter] removeObserver:self],以防止在没有获取touchesEnded事件的情况下离开页面。

您可能希望通知将其消息发送到特殊的touchesEndedInSuperview方法,该方法将调用touchesEnded本身,但这取决于您是否有任何特殊处理要做。

答案 1 :(得分: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];
    }
}