1

我有一个子类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作为参考,平铺视图在 a:模式中嵌套得相当深 。

我试过没有成功:

  • 在 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];在事件处理程序中使用,我可以看到返回的视图是 aUIScrollView而不是TileView预期的 a 。

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

4

3 回答 3

8

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

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

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

于 2013-08-03T20:30:58.633 回答
0

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

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

于 2015-03-31T11:23:06.910 回答
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");
}
于 2018-11-11T21:32:28.177 回答