我正在创建一个应用程序,其中我有一个背景视图,并且有六个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!");
}
}
}
答案 0 :(得分:12)
默认情况下,UIImageView配置为不注册用户交互。
来自UIImageView文档:
新的图像视图对象配置为忽略用户事件 默认。如果要处理自定义子类中的事件 UIImageView,你必须明确地改变它的值 初始化对象后,userInteractionEnabled属性为YES。
因此,在您初始化视图后,您应该:
view.userInteractionEnabled = YES;
这将重新启用交互,您应该能够注册触摸事件。
答案 1 :(得分:1)
你的方法(包含视图上的单个GR)的重写是有效的,但它会让我们的大脑受到影响,使得坐标系统正确,这绝对是发布代码中的问题。 / p>
更好的答案是将N个手势识别器附加到每个UIImageViews。它们都可以具有相同的目标并使用相同的handleTap:方法。 handleTap:可以在不搜索任何几何形状的情况下获取视图:
UIImageView *viewHit = (UIImageView *)sender.view;