hitTest:withEvent:不工作

时间:2012-04-22 19:37:54

标签: iphone ios

我正在创建一个应用程序,其中我有一个背景视图,并且有六个UIImageView作为子视图。我有一个UITapGestureRecognizer来查看其中一个UIImageView被点击,而下面的handleTap方法就是手势识别器调用的内容。但是,当我运行它时,hitTest:withEvent:总是返回背景视图,即使我点击其中一个imageViews。当我调用hitTest时,它是否与事件有关?

由于

- (void) handleTap: (UITapGestureRecognizer *) sender
{
    if (sender.state == UIGestureRecognizerStateEnded)
    {
        CGPoint location = [sender locationInView: sender.view];
        UIView * viewHit = [sender.view hitTest:location withEvent:NULL];
        NSLog(@"%@", [viewHit class]);
        if (viewHit == sender.view) {}
        else if ([viewHit isKindOfClass:[UIImageView class]])
        {
            [self imageViewTapped: viewHit];
            NSLog(@"ImageViewTapped!");
        }
    }
}

2 个答案:

答案 0 :(得分:12)

默认情况下,UIImageView配置为不注册用户交互。

来自UIImageView文档:

  

新的图像视图对象配置为忽略用户事件   默认。如果要处理自定义子类中的事件   UIImageView,你必须明确地改变它的值   初始化对象后,userInteractionEnabled属性为YES。

因此,在您初始化视图后,您应该:

view.userInteractionEnabled = YES;

这将重新启用交互,您应该能够注册触摸事件。

答案 1 :(得分:1)

你的方法(包含视图上的单个GR)的重写是有效的,但它会让我们的大脑受到影响,使得坐标系统正确,这绝对是发布代码中的问题。 / p>

更好的答案是将N个手势识别器附加到每个UIImageViews。它们都可以具有相同的目标并使用相同的handleTap:方法。 handleTap:可以在不搜索任何几何形状的情况下获取视图:

UIImageView *viewHit = (UIImageView *)sender.view;