您要做的是向 UITableView 添加一个手势识别器,以响应适当的手势。我建议不要使用 UITapGestureRecognizer,因为 UITableView 已经在使用点击来选择单元格,因此您可能想尝试使用 UILongPressGestureRecognizer。我整理了一个小样本,说明如何做到这一点,如下所示:
在我的 viewDidLoad 中,我做了以下事情:
UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPressFrom:)];
[self.tableView addGestureRecognizer:gesture];
和 handleLongPressFrom: 如下:
- (void)handleLongPressFrom:(UILongPressGestureRecognizer *)recognizer {
NSLog(@"handleLongPressFrom: %@", recognizer);
// Add real code here
}
可以在此处找到完整的手势列表。
哦,如果你还想继续使用 tap,请查看这个堆栈溢出问题。我不知道所介绍的方法是否完全有效,但这将是一个很好的起点。
将 UITapGestureRecognizer 与 UITableView 一起使用:好的,因为点击手势似乎是您的用例的正确手势,您可以尝试执行以下操作。第 1 步是设置我上面列出的手势识别器,使用轻击手势而不是长按手势。
viewDidLoad 中的代码与一个重要的补充非常相似......
UITapGestureRecognizer *gesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapFrom:)];
// we need to set the gesture delegate so we can allow the tap to pass through to the
// UITableViewCell if necessary.
gesture.delegate = self;
[self.tableView addGestureRecognizer:gesture];
handleTapFrom: 函数几乎相同,只是将不同的手势识别器作为参数。
- (void)handleTapFrom:(UITapGestureRecognizer *)recognizer {
NSLog(@"handleTapFrom: %@", recognizer);
// Add real code here
}
这种方法的主要变化是我们需要实现 UIGestureRecognizerDelegate 协议。由于我们的目标是允许点击手势通过 UITableView 传递到它的子视图(即 UITableViewCell 和它的组件),我们需要实现 gestureRecognizer:shouldRecieveTouch: 函数。以下实现应涵盖您正在尝试的内容。
#pragma mark UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
// If the view that is touched is not the view associated with this view's table view, but
// is one of the sub-views, we should not recognize the touch.
if (touch.view != self.tableView && [touch.view isDescendantOfView:self.tableView]) {
return NO;
}
return YES;
}
isDescendantOfView: 如果它正在测试的视图与进行测试的视图相同,则函数返回 YES,因此我们需要单独适应这种情况。你可以通过使用gestureRecognizer.view而不是self.tableView来生成这个函数,但我认为在这种情况下没有必要。