【发布时间】: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 的唯一子视图),它将停止工作。 containerView 有 userInteractionEnabled = YES。
【问题讨论】:
-
你忘了[点击 setNumberOfTouchesRequired:1]; ?
-
我刚试过这个 - 不幸的是它没有成功。
-
您确定正在调用
setup方法吗? -
是的,我在 setup 方法中添加了断点。它肯定被调用了。
-
会不会是您的 TileView 超出了其父视图的范围?尝试将滚动视图和/或容器视图的 clipToBounds 设置为 YES 并查看 TileView 是否消失。
标签: iphone ios uiscrollview uigesturerecognizer