无需将手势识别器添加到每个单独的单元格,您可以将手势识别器添加到表格视图并确定从用户触摸点选择了哪个单元格,然后确定用户是否触摸了图像或单元格。
首先确保您的控制器采用 UIGestureRecognizerDelegate 协议。
@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
然后UIGestureRecognizer
在UITableView
视图加载时添加 。
- (void)viewDidLoad
{
[super viewDidLoad];
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
singleTap.delegate = self;
singleTap.numberOfTapsRequired = 1;
singleTap.numberOfTouchesRequired = 1;
[self.tableView addGestureRecognizer:singleTap];
}
此委托方法确定是否handleTap:
应执行该方法。如果它可以indexPath
从用户触摸中找到一个,则返回,YES
否则返回NO
。
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UITableView *tableView = (UITableView *)gestureRecognizer.view;
CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
if ([tableView indexPathForRowAtPoint:p]) {
return YES;
}
return NO;
}
一旦我们确定用户是否点击了单元格,就会调用 handleTap: 方法,然后确定用户是否触摸了图像或单元格的任何其他部分。
- (void)handleTap:(UITapGestureRecognizer *)tap
{
if (UIGestureRecognizerStateEnded == tap.state) {
UITableView *tableView = (UITableView *)tap.view;
CGPoint p = [tap locationInView:tap.view];
NSIndexPath* indexPath = [tableView indexPathForRowAtPoint:p];
[tableView deselectRowAtIndexPath:indexPath animated:NO];
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
CGPoint pointInCell = [tap locationInView:cell];
if (CGRectContainsPoint(cell.imageView.frame, pointInCell)) {
// user tapped image
} else {
// user tapped cell
}
}
}