11

我有一个问题,在我的 UIScrollView 的内容视图中我的 UILabels 上的 UITapGestureRecognizer 没有调用它的方法。

视图层次结构如下:

  • 滚动视图(UIScrollView)
    • 内容视图(UIView)
      • testLabel (UILabel) - 这里是 UITapGestureRecognizer 的附加位置

我已将代码提炼为一个示例以突出问题

// Set scrollview size - Added in Storyboad
[scrollView setContentSize:CGSizeMake([arrayOfVerbs count]*self.view.frame.size.width, scrollView.contentSize.height)];
[scrollView setCanCancelContentTouches:YES]; // Tried both yes and no
[scrollView setPagingEnabled:YES];

// Add content view
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height)];
[scrollView addSubview:contentView];

// Add test UILabel
UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
[testLabel setBackgroundColor:[UIColor redColor]];
[testLabel setText:@"Test touch"];
[testLabel setUserInteractionEnabled:YES];
[contentView addSubview:testLabel];

// Add gesture recogniser
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playSound:)];
singleTap.numberOfTapsRequired = 1;
[testLabel addGestureRecognizer:singleTap];

这是点击手势识别器应该调用的方法

- (void)playSound:(UITapGestureRecognizer *)sender {

    NSLog(@"play sound");

    if(sender.state == UIGestureRecognizerStateEnded)
    {
        int pronounNumber = [sender.view tag];
        int exampleNumber = (int)sender.view.frame.origin.x%(int)self.view.frame.size.width;

        NSLog(@"Pronoun is %i and example is %i", pronounNumber, exampleNumber);
    }
}

当我尝试触摸 UILabel 时,永远不会调用此方法。

我已尝试按照此线程的建议在滚动视图上将属性 canCancelContentTouches 设置为 YES 和 NO ,但它仍然无法正常工作。

奇怪的是,如果我在 scrollView 之外添加一个 UILabel,那么手势识别器就会起作用!所以问题只发生在我的 contentView 中,它是我的 scrollView 的子视图。

我正在使用自动布局,如果这可能有什么不同?

谢谢!

4

3 回答 3

15

滚动视图也有一个手势识别器。默认情况下,任何时候只有 1 个手势识别器可以处理触摸。您需要让自己成为手势的代表,然后实现gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer:return YES。这将允许它与滚动视图同时工作。

于 2013-07-18T10:45:33.247 回答
2

将委托添加到 tagGestures,

UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(playSound:)];
singleTap.numberOfTapsRequired = 1;
singleTap.delegate = self;
[testLabel addGestureRecognizer:singleTap];

编辑:-

contentView.userInteractionEnabled = YES;

把这行代码放在你的代码上就行了。

于 2013-07-18T10:40:36.073 回答
-3
[yourlabel.addGestureRecognizer:tapGestureDeFromage];

应该将手势明确添加到您的标签中。

于 2013-07-18T10:50:50.713 回答