我有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。
当用户点击子视图(在scrollView中)时,我理解父滚动视图'截取'所有触摸并决定它们是否相关(用于平移,缩放,等等......)如果不通过触摸到其子视图。因此,touchesBegan:withEvent:
永远不会在scrollview的子视图中调用。
我想要的是在子视图中检测触碰事件(即,用户将手指放在屏幕上的瞬间),无论用户是否平移,滚动或点击,并处理在孩子内部轻拍。 scrollview的行为应该保持不变。
也许有一种更好的方法没有手势识别器,例如覆盖hitTest:withEvent
但是我的微弱的人脑似乎无法弄清楚它!
UPDATE /实施例:
如果你看一下UITableView
,它是一个包含单元格的滚动视图。您会注意到,将手指放在单元格上会立即突出显示它。然后滚动动作“取消”水龙头。这通常就是这个想法。
答案 0 :(得分:0)
将手势识别器添加到子视图会使您受到滚动视图的支配,以及在确定用户不打算滚动后它决定传递的事件。如果它符合您的需求,可以设置一个简单的解决方法:
tableView.delaysContentTouches = NO;
这将导致立即调用触摸方法。
您的另一个选择是在滚动视图本身上侦听手势,并使用命中测试来确定用户与子视图的交互方式。