ジェスチャ認識機能を個々のセルに追加するのではなく、テーブルビューに追加して、ユーザーがタッチしたポイントから選択されたセルを判別し、ユーザーが画像またはセルにタッチしたかどうかを判別できます。
まず、コントローラーが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
}
}
}