UIScrollView和检测tap手势下的子视图

4
我已经在self.view上添加了一个TapGestureRecognizer:
    tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTap:)];
    tap.numberOfTapsRequired = 1;
    tap.numberOfTouchesRequired = 1;
    [self.view addGestureRecognizer:tap];
    [tap release];

这个视图包含一个单独的UIScrollView,其中包含图像和标签。我想检测用户是否点击了标签。

- (void)singleTap:(UIGestureRecognizer*)gestureRecognizer {

    CGPoint pt = [gestureRecognizer locationInView:self.view];

    UIView *v = [self.view hitTest:pt withEvent:nil];
    if ([v isKindOfClass:[UILabel class]]) {
        NSLog(@"label!");
        return;
    }   
    // else do other stuff if its not a label

然而,我在日志中并没有看到这个标签!
2个回答

5
我认为这是因为在UILabel上默认情况下userInteractionEnabled被设置为NO。尝试打开它。
编辑:这只是一个猜测,但是为了确认,苹果文档中关于[UIView hitTest:withEvent:]的说明如下:
此方法忽略隐藏的视图对象,已禁用用户交互或alpha级别小于0.01的视图对象。

谢谢!我还修改了我的代码,使用UIScrollView进行hitTest和locationInView。 - user317033

0

你的子视图,例如标签本身,实际上隐藏了底层视图的用户交互。

为什么不将手势识别器添加到你的标签中呢?或者你可能想使用UIButton来代替标签。

或者 -

如果你不想确定哪个标签被触摸了,你可以在所有标签上方添加一个无形视图(一个空视图,既不是隐藏的也不是alpha=0),并将手势识别器添加到其中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接