Ios UIScrollView子视图中UILabels上的UIAPTgestureRecognitor不工作

Ios UIScrollView子视图中UILabels上的UIAPTgestureRecognitor不工作,ios,objective-c,uiscrollview,uilabel,uigesturerecognizer,Ios,Objective C,Uiscrollview,Uilabel,Uigesturerecognizer,我的UIScrollView的内容视图中的UILabels上的UIAPTgestureRecognitor没有调用其方法时出现问题 视图层次结构如下所示: 滚动视图(UIScrollView) contentView(UIView) testLabel(UILabel)-此处是连接UITapGestureRecognitor的位置 我已将代码提炼为一个示例来突出问题 // Set scrollview size - Added in Storyboad [scrollView set

我的UIScrollView的内容视图中的UILabels上的UIAPTgestureRecognitor没有调用其方法时出现问题

视图层次结构如下所示:

  • 滚动视图(UIScrollView)
    • contentView(UIView)
      • testLabel(UILabel)-此处是连接UITapGestureRecognitor的位置
我已将代码提炼为一个示例来突出问题

// 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的一个子视图

我使用的是自动布局,如果有什么不同的话


谢谢

将代理添加到标记中

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

contentView.userInteractionEnabled = YES;

把这行代码放在上面,这样就行了。

滚动视图还有一个手势识别器。默认情况下,一次只能有一个手势识别器处理触摸。您需要让自己成为手势的代表,然后使用手势识别器同时执行
手势识别器:should recognizes:
返回
YES
。这将允许它与滚动视图同时工作

[yourlabel.addGestureRecognizer:tapGestureDeFromage];

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

嗨,我刚刚尝试将代理设置为self,并实现了
协议和-
(BOOL)手势识别器:(uigesturecognizer*)手势识别器应该接收touch:(UITouch*)touch
方法。仍然不起作用,为什么我需要为它实现一个委托,而我在scrollview之外的UILabels不需要它?@Joseph Williamson:你在我的回答中添加了最后一行代码了吗?一次添加并检查。一次检查你的scrollview框架。对不起,你检查我的scrollview框架是什么意思?@Joseph Williamson:问题是contentView框架或scrollview框架一旦给出静态值并检查。好,所以我设置
singleTap.delegate=self
并在my.h文件中实现了
UIgestureRecognitizerDelegate
,并添加
gestureRecognitizer:shouldRecognitizewithgestureRecognitizer:
,但它仍然不起作用。是否调用委托方法?内容视图(日志)的大小是多少?天哪!你说对了!很奇怪,@wain,如果在scrollview中的堆栈视图的“单元格”中添加一个tap(UITapgestureRecognitizer),它看起来确实有效(不管怎样,现在)。如果不使用,则应同时识别。我不知道为什么。对于任何读到这篇文章的人来说,我有一个令人着迷的模糊问题。我正在动态生成UIViewController及其视图,并将它们插入到滚动视图中。当然,在创建视图控制器时,视图控制器本身并不特别保留!视图会保留,但VC会消失,除非您保留它。请尝试设置[contentView setClipBounds:YES];并查看
内容视图中的
标签是否可见,如果不可见,则标签不在触摸区域,请调整大小属性。。