我有一个子类的UIView,我们称它为TileView.m/h

TileView.m中,我有以下代码:([setup]肯定被调用,我检查了断点)。

- (void)setup {
    self.userInteractionEnabled = YES;
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(testPressed:)];
    [self addGestureRecognizer:tap];
}

- (void)testPressed:(UITapGestureRecognizer *)sender {
    NSLog(@"tap pressed");
}

由于某些原因,当我点击视图时,不会调用testPressed方法!

奇怪的是,如果我将TileView类复制到一个空白的xCode项目中并在那里进行设置,那么一切都会很好。这是特有的,因为手势首先由子视图处理,然后由 super 视图处理-因此tile类不应受到其 super 视图的影响。手势也完全包含在TileView类中。

作为参考,磁贴视图相当深地嵌套在:Controller -> controller's view -> scroll view -> container view -> tile view模式。

我尝试过但没有成功:
  • 在TileView及其所有子视图上设置userInteractionEnabled = YES。
  • 从代码的其他部分删除所有手势识别器,以避免干扰。
  • 设置tap.delegate = self,然后将gestureRecognizer:shouldRecognizeSimultaneously...实施为始终return YES;

  • 没运气 :/

    还有什么想法可能会出错吗?或者我可以运行哪些测试以更详细地了解问题?

    编辑:更多详细信息

    回想一下,图块视图嵌套在:Controller -> controller's view -> scroll view -> container view -> tile view
    如果我使用以下命令在控制器文件中添加手势识别器:
    [self.view addGestureRecognizer:tap]
    

    然后在事件处理程序中使用[self.view hitTest:[sender locationInView:self.view] withEvent:nil];,我可以看到返回的视图是UIScrollView,而不是预期的TileView

    另外,将手势识别器添加到self.scrollView可以正常工作,但是如果我将其添加到self.containerView(这是scrollView的唯一子视图),则会停止工作。 containerView具有userInteractionEnabled = YES

    最佳答案

    如果视图包含子视图UIImageView,请记住,必须将userInteractionEnabled显式设置为YES(默认为NO)。

    否则,图像视图将阻止水龙头到达 super 视图。

    另外,请记住设置触摸次数。

    关于iphone - UIGestureRecognizer无法启动的可能原因?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18036870/

    10-09 19:05