【问题标题】:Possible reasons why UIGestureRecognizer is not firing?UIGestureRecognizer 未触发的可能原因?
【发布时间】:2013-08-03 20:13:14
【问题描述】:

我有一个子类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 类中。

作为参考,平铺视图嵌套相当深: 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

【问题讨论】:

  • 你忘了[点击 setNumberOfTouchesRequired:1]; ?
  • 我刚试过这个 - 不幸的是它没有成功。
  • 您确定正在调用setup 方法吗?
  • 是的,我在 setup 方法中添加了断点。它肯定被调用了。
  • 会不会是您的 TileView 超出了其父视图的范围?尝试将滚动视图和/或容器视图的 clipToBounds 设置为 YES 并查看 TileView 是否消失。

标签: iphone ios uiscrollview uigesturerecognizer


【解决方案1】:

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

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

另外,记得设置触摸次数。

【讨论】:

  • 没有一个子视图是 UIImageViews - (有一些 UILabel 和其他 UIViews)。但是,即使我遍历子视图并在所有子视图上设置userInteractionEnabled = YES,它仍然无法正常工作。感谢您的意见。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    它不触发的原因是因为您没有保留对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");
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-18
      • 2014-05-01
      相关资源
      最近更新 更多