Zamiast dodawać funkcje rozpoznawania gestów do poszczególnych komórek, można dodać je do widoku tabeli i określić, która komórka została wybrana z punktu dotknięcia użytkownika, a następnie określić, czy użytkownik dotknął obrazu lub komórki.
Najpierw upewnij się, że kontroler przyjmuje protokół UIGestureRecognizerDelegate.
@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
następnie dodać UIGestureRecognizer
do UITableView
gdy widok obciążeń.Ta metoda delegatów określa, czy należy wykonać metodę handleTap:
. Jeśli można znaleźć numer indexPath
od użytkownika, to zwraca on YES
w przeciwnym razie zwraca NO
.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UITableView *tableView = (UITableView *)gestureRecognizer.view;
CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
if ([tableView indexPathForRowAtPoint:p]) {
return YES;
}
return NO;
}
Po ustaleniu, czy użytkownik kliknął w komórce, który handleTap: wywoływana jest metoda, która decyduje, czy użytkownik dotknął obraz, lub dowolnej innej części komórki.
- (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
}
}
}
Dla tych, którzy nie wiedzą. Cała konfiguracja 'UITapGestureRecognizer' w' viewDidLoad' może być również wykonana w układzie Xcode UI (inaczej IB). Będziesz chciał zmienić typ zwrotu 'handleTap:' na 'IBAction'. – ThomasW