UIGestureRecognizer未触发的可能原因?

时间:2013-08-03 20:13:14

标签: iphone ios uiscrollview uigesturerecognizer

我有一个子类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项目中并将其设置在那里,一切都运行得很好。这是特殊的,因为手势首先由子视图处理,然后由超级视图处理 - 因此tile类不应受其超级视图的影响。此手势也完全包含在TileView类中。

作为参考,tile视图嵌套在一个相当深的地方: 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的唯一子视图),则会停止工作。 containerViewuserInteractionEnabled = YES

3 个答案:

答案 0 :(得分:7)

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

如果没有,图像视图将阻止点按到达超级视图。

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

答案 1 :(得分:0)

您可能还想检查您是否尝试将UITapGestureRecognizer对象重用于不同的视图。

这似乎是可能的,因为您只是将手势附加到视图,但最终需要将视图分配给手势对象上的视图属性,因此将手势对象添加到第二个视图只会覆盖第一

答案 2 :(得分:0)

之所以不触发,是因为您没有保留对UITapGestureRecognizer的引用。 setup函数返回后,您的UITapGestureRecognizer就被释放。 如果您希望它正常工作,请将其保存到属性中:

@property (strong, nonatomic) UITapGestureRecognizer *tapRecognizer;

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

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