Anstatt die Gestenerkenner zu jeder einzelnen Zelle hinzuzufügen, können Sie der Tabellenansicht eine hinzufügen und bestimmen, welche Zelle aus dem Berührungspunkt des Benutzers ausgewählt wurde, und dann bestimmen, ob der Benutzer das Bild oder die Zelle berührt hat.
Stellen Sie zuerst sicher, dass Ihr Controller das UIGestureRecognizerDelegate-Protokoll annimmt.
@interface MyTableViewController() <UIGestureRecognizerDelegate>
@end
Dann wird die UIGestureRecognizer
zum UITableView
, wenn die Ansicht Lasten hinzu.
Diese Delegiertenmethode bestimmt, ob die Methode handleTap:
ausgeführt werden soll. Wenn es einen indexPath
von den Benutzern finden kann, gibt es YES
zurück, andernfalls gibt es NO
zurück.
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
{
UITableView *tableView = (UITableView *)gestureRecognizer.view;
CGPoint p = [gestureRecognizer locationInView:gestureRecognizer.view];
if ([tableView indexPathForRowAtPoint:p]) {
return YES;
}
return NO;
}
Sobald wir, wenn der Benutzer in einer Zelle geklickt hat festgestellt haben, die handleTap: ist Methode aufgerufen, die dann entscheidet, ob der Benutzer das Bild berührt, oder jede andere der Zelle Teil.
- (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
}
}
}
Für diejenigen, die nicht wissen. Alle 'UITapGestureRecognizer' Einstellungen in' viewDidLoad' können auch im Xcode UI Layout (alias IB) vorgenommen werden. Sie sollten den Rückgabetyp von 'handleTap:' in 'IBAction' ändern. – ThomasW