Invece di aggiungere i riconoscitori di gesti a ogni singola cella, è possibile aggiungerne uno alla vista tabella e determinare quale cella è stata selezionata dal punto di contatto dell'utente, quindi determinare se l'utente ha toccato l'immagine o la cella.
Prima di tutto assicurarsi che il controller adotti il protocollo UIGestureRecognizerDelegate.
@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
quindi aggiungere il UIGestureRecognizer
alla UITableView
quando i carichi di vista.
- (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];
}
Questo metodo delegato determina se il metodo handleTap:
deve essere eseguito. Se riesce a trovare un indexPath
da parte degli utenti, restituisce YES
altrimenti restituisce NO
.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UITableView *tableView = (UITableView *)gestureRecognizer.view;
CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
if ([tableView indexPathForRowAtPoint:p]) {
return YES;
}
return NO;
}
Una volta che abbiamo determinato se l'utente ha fatto clic in una cella, il handleTap: metodo è chiamato, che decide poi se l'utente ha toccato l'immagine, o di qualsiasi altra parte della cellula.
- (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
}
}
}
Per coloro che non conoscono. Tutte le impostazioni di 'UITapGestureRecognizer' in' viewDidLoad' possono anche essere eseguite nel layout dell'interfaccia utente Xcode (aka IB). Dovrai cambiare il tipo di ritorno di 'handleTap:' a 'IBAction'. – ThomasW