我有UIScrollView
一个带孩子的UIView
。我已经继续UITapGestureRecognizer
向子视图添加了一个,如下所示:
// in child
- (void)setup
{
[self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleSingleTap:)]];
}
// 和处理程序
- (void)handleSingleTap:(UITapGestureRecognizer*)sender
{
if (sender.state == UIGestureRecognizerStateEnded)
NSLog(@"tap ended"); // this gets called
else if (sender.state == UIGestureRecognizerStateBegan)
NSLog(@"tap began"); // never get's called
}
这段代码可能在视图控制器中,但我有理由在视图本身中处理触摸。
如您所见,我正在测试水龙头的状态。然而,唯一被调用的状态是用户从屏幕上移开手指,完成点击。即 UIGestureRecognizerStateEnded。
当用户点击子视图(在滚动视图中)时,我知道父滚动视图“拦截”所有触摸并决定它们是否相关(用于平移、缩放等......),如果不通过触摸( es) 到它的子视图。因此touchesBegan:withEvent:
永远不会在滚动视图的子视图上被调用。
我想要的是在子视图中检测触摸事件(即用户将手指放在屏幕上的那一刻),无论用户随后是平移、滚动还是点击,并在其中处理该点击孩子。滚动视图的行为应该保持不变。
也许有更好的方法没有手势识别器,例如覆盖hitTest:withEvent
,但我那微不足道的人脑似乎无法弄清楚!
更新/示例:如果您查看一个UITableView
包含单元格的滚动视图。您会注意到将手指放在单元格上会立即突出显示它。然后滚动“取消”点击的行为。大体上是这样的想法。