UIScrollView触摸由子视图处理

时间:2012-12-07 01:37:45

标签: iphone ios ipad uigesturerecognizer uiresponder

我有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,它是一个包含单元格的滚动视图。您会注意到,将手指放在单元格上会立即突出显示它。然后滚动动作“取消”水龙头。这通常就是这个想法。

1 个答案:

答案 0 :(得分:0)

将手势识别器添加到子视图会使您受到滚动视图的支配,以及在确定用户不打算滚动后它决定传递的事件。如果它符合您的需求,可以设置一个简单的解决方法:

tableView.delaysContentTouches = NO;

这将导致立即调用触摸方法。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIScrollView_Class/Reference/UIScrollView.html

您的另一个选择是在滚动视图本身上侦听手势,并使用命中测试来确定用户与子视图的交互方式。