我触摸了哪个对象或视图?

时间:2009-11-15 02:15:35

标签: iphone objective-c events touch

在一个ViewController中工作,它有几个视图作为子视图添加到它,我有一个touchesBegan方法:

    UIImageView *testImage = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"test.png"]];
    testImage.frame = CGRectMake(0, 0, 480, 280);
    [self.view addSubview:testImage];

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint point;
    UITouch *touch = [touches anyObject];
    point.x = [touch locationInView:self.view].x;
    point.y = [touch locationInView:self.view].y;

    if ( point.y >= 280 && point.y <= 320 )
    {
        if ( point.x >= 0 && point.x <= 160 )
        {
            [self menu1];
        }

        if ( point.x >= 161 && point.x <= 320 )
        {
            [self menu2];
        }

        if ( point.x >= 321 && point.x <= 480 )
        {
            [self menu3];
        }
    }
}

我的问题是如何通过该方法辨别哪个视图被点击了?我一直在使用这些屏幕坐标,但如果我也在运行时移动这些视图,那么这将无效。

有没有办法查看在触摸或事件或上面的代码中点击了哪个视图:

UITouch *touch = [touches anyObject];

任何帮助赞赏//:)

4 个答案:

答案 0 :(得分:3)

[touch view]将为您提供最初发生触摸的视图(即,即使用户在触摸期间将手指移离视图,此视图也将保持不变)。

如果这不是您需要的行为,请使用:

[self.view hitTest:[touch locationInView:self.view] withEvent:event];

答案 1 :(得分:3)

假设您有一个带有这些ivars的视图控制器(连接到Interface Builder中的控件)

IBOutlet UILabel *label;
IBOutlet UIImageView *image;

要判断触摸是否触及这些项目或背景,请将此方法添加到视图控制器。

  -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event;
{  
    UITouch *touch = [[event allTouches] anyObject];

    if ([touch view] == label) {
        NSLog(@"touched the label");
    }

    if ([touch view] == image) {
        NSLog(@"touched the image");
    }

    if ([touch view] == self.view) {
        NSLog(@"touched the background");
    }
}

要响应触摸的任何UIView子类(如UIView,UILabel或UIImageView)必须将 .userInteractionEnabled 属性设置为YES。

答案 2 :(得分:1)

我可能会遗漏一些东西,但是你的“menuX”元素不会有自己的描述它们的大小和位置吗?然后你要做的就是询问这个点是否在那些矩形内。

答案 3 :(得分:1)

为什么要实施自己的热门测试?只需将透明按钮放在任何你想要的地方,这是微不足道的。