0

我有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包含单元格的滚动视图。您会注意到将手指放在单元格上会立即突出显示它。然后滚动“取消”点击的行为。大体上是这样的想法。

4

1 回答 1

0

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

tableView.delaysContentTouches = NO;

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

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

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

于 2012-12-07T01:48:55.277 回答