2014-07-24 3 views
5

Ich möchte einen Tipp in einem UITableView ohne die Zellen behandeln. Mit anderen Worten, die Kopf- und Fußzeilen.Wie erkenne ich Taps auf einem UITableView außerhalb von UITableViewCells - also in der Abschnittsüberschrift?

Ich kann den Headern einen Gestenerkenner hinzufügen (es gibt keine Fußzeilen), aber das Feld am unteren Rand des letzten Abschnitts reagiert nicht auf ein Tippen.

Anstatt die oben genannten Gestenerkenner hinzuzufügen, habe ich versucht, der Tabelle einen Gestenerkenner hinzuzufügen, aber verhindert, dass tableView:didSelectRowAtIndexPath: aufgerufen wird.

Ich versuchte alle Arten von UIGestureRecognizerDelegate Anrufe mit nicht viel Glück.

Ich habe endlich das durch cancelsTouchesInView = NO auf der Erkennungs Einstellung zu arbeiten (ich denke, das ist das Geheimnis war) und gestureRecognizer:shouldRecognizeSimultaneouslyWithGestureRecognizer: in dem Delegierten der Umsetzung, so dass die tableView berührt bekam und tableView:didSelectRowAtIndexPath:

Der Handler Taps genannt, um herauszufiltern hat auf den Zellen, aber zumindest funktioniert es. (Auch gefunden, einen Fehler in UITableViewindexPathForRowAtPoint:point die manchmal ungültig indexPaths zurückgibt.)

Meine Frage ist: Gibt es eine bessere Möglichkeit, die Zell Blick auf immer berührt/Gesten zu verhindern, dass der Tisch immer durch? (Ich schreibe Code, wenn mir niemand bessere Ideen gibt.)

+0

Siehe meine Antwort seine Arbeits ... –

Antwort

3

Hier ist der Code, den ich mit ging.

1 Fügen Sie der Tabelle einen Tippgesteerkenner hinzu. Set Bricht Berührungen in der Ansicht deaktiviert ab.

2 Lassen Sie die Gesten bis die Tabelle zu.

#pragma mark - UIGestureRecognizerDelegate 

/** 
* Prevents the tap gesture recognizer in the table from gobbling taps 
* and allows the table to perform tableView:didSelectRowAtIndexPath: 
* <p> 
* The gesture recognizer must have cancelsTouchesInView == NO to allow 
* the touches through to the table. 
* <p> 
* The action must check that the tap occurred outside of cells. 
* 
* @see handleTap: 
*/ 
- (BOOL) gestureRecognizer:(UIGestureRecognizer*)recognizer 
    shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer*)o { 
    return recognizer.view == self.table; 
} 

3 Überprüfen Sie, ob sich der Wasserhahn in einer Zelle befindet.

/** 
* Filters a tap on the table to those on the headers/footer. 
* <p> 
* Note, indexPathForRowAtPoint: has a bug and returns valid indexPaths 
* for taps in the last section header and table footer. So an extra 
* check is made to ensure that the tap was, in fact, in the cell. 
*/ 
- (IBAction) handleTap:(UITapGestureRecognizer*)tap { 
    if (UIGestureRecognizerStateEnded == tap.state) { 
     CGPoint point = [tap locationInView:tap.view]; 
     NSIndexPath* index = [self.table indexPathForRowAtPoint:point]; 
     UITableViewCell* cell; 

     if (index) { 
      cell = [self.table cellForRowAtIndexPath:index]; 
      point = [tap locationInView:cell]; 

      if (point.y < 0 || point.y >= cell.frame.size.height) { 
       index = nil; 
      } 
     } 

     if (!index) { 
      [self.view performSelector:@selector(endEditing:) 
          withObject:@(YES) afterDelay:0]; 
     } 
    } 
} 
4

Wenn Sie nicht verstehen müssen - was geklickt wurde (Fußzeile oder Kopfzeile), können Sie den folgenden Ansatz versuchen.

Hinzufügen Gestenerkennung in viewDidLoad Methode.

- (void) tableViewLongPress:(UILongPressGestureRecognizer *)gestureRecognizer { 
    CGPoint p = [gestureRecognizer locationInView:self.tableView]; 

    NSIndexPath *indexPath = [self.messageTableView indexPathForRowAtPoint:p]; 
    if (indexPath == nil) 
     NSLog(@"long press on table view but not on a row"); 
    else { 
     NSLog(@"long press on table view on a row"); 
    } 
} 

Achtung! Ich habe diesen Code nicht getestet :)

1

Hinzufügen von Gestenerkennung zu Ihrer eigenen Abschnitt Kopf- und Fußzeilenansichten ist richtig.

Um auf Berührungen im Bereich unter der letzten Zeile zu replizieren, fügen Sie der Tabelle eine Fußzeilenansicht hinzu. Fügen Sie diesem Tabellenfuß eine Gestenerkennung hinzu. Machen Sie diese Fußzeile so groß wie den Bildschirm.

Der einzige Nachteil ist, dass Sie die Zeilen unter der letzten Zeile verlieren, wenn die Zeilen den Bildschirm nicht füllen. Wenn Sie sie wirklich möchten, richten Sie Ihre benutzerdefinierte Tabellenfußansicht ein, um Linien zu zeichnen, die die Zeilen nachahmen.

2

Haben Sie versucht, longGesture in viewForHeaderInSection hinzufügen ??

Wenn nicht als dies wie folgt vor:

-(UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 

    UILabel *headerLabel = [[UILabel alloc]init]; 
    headerLabel.tag = section; 
    headerLabel.userInteractionEnabled = YES; 
    headerLabel.backgroundColor = [UIColor greenColor]; 
    headerLabel.text = [NSString stringWithFormat:@"Header.%d",section]; 
    headerLabel.frame = CGRectMake(0, 0, tableView.tableHeaderView.frame.size.width, tableView.tableHeaderView.frame.size.height); 


    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(hederClicked:)]; 
    tapGesture.cancelsTouchesInView = NO; 
    [headerLabel addGestureRecognizer:tapGesture]; 

    return headerLabel; 

    //return nil; 
} 

-(void)hederClicked:(UIGestureRecognizer*)sender 
{ 
    UILabel *lbl = (UILabel*)sender.view; 
    NSLog(@"header no : %d", lbl.tag); 
} 
1

hinzufügen Kopfansicht in Ihre Tableview wie unten Code:

Höhe für in Tabellenkopf Ansicht

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section 
{ 
    return 100; 
} 

Auch im Hinblick hinzufügen Header und Tapesture in dieser Ansicht.

-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section 
{ 
    UIView *viewHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.frame.size.width, 100)]; 
    /* Create custom view to display section header... */ 
    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, tableView.frame.size.width, 100)]; 
    [label setFont:[UIFont boldSystemFontOfSize:12]]; 

    /* Section header is in 0th index... */ 
    [label setText:@"Header View"]; 
    [viewHeader addSubview:label]; 
    [viewHeader setBackgroundColor:[UIColor colorWithRed:166/255.0 green:177/255.0 blue:186/255.0 alpha:1.0]]; 


    // Add TapGestureRecognizer 

    UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapBehind:)]; 

    [recognizer setNumberOfTapsRequired:1]; 
    recognizer.cancelsTouchesInView = NO; //So the user can still interact with controls in the modal view 
    [viewHeader addGestureRecognizer:recognizer]; 

    return viewHeader; 
} 

TapGestureRecognizer mehode

- (void)handleTapBehind:(UITapGestureRecognizer *)sender 
{ 
    if (sender.state == UIGestureRecognizerStateEnded) 
    { 
     [[[UIAlertView alloc]initWithTitle:@"Demo" message:@"Test On header Click" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil] show]; 
    } 
} 

Ihr Ausgang:

enter image description here

1

Hier ist die einfachste effizienteste Implementierung:

Verwenden Sie diese UITableViewDelegate Methoden (iOS6 +):

-(void)tableView:(UITableView *)tableView 
    willDisplayHeaderView:(UIView *)view 
    forSection:(NSInteger) 

- (void)tableView:(UITableView *)tableView 
    willDisplayFooterView:(UIView *)view 
    forSection:(NSInteger)section 

Sie können diese Methoden verwenden, um leicht einen UITapGestureRecognizer zu einem Abschnitt Fußzeile/Kopfzeile hinzufügen.

Ex:

- (void)tableView:(UITableView *)tableView willDisplayHeaderView:(UIView *)view forSection:(NSInteger)section 
    { 
     UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(sectionTapped:)]; 

     [view addGestureRecognizer:recognizer]; 

    } 

    - (IBAction)sectionTapped:(UITapGestureRecognizer *)recognizer { 
    NSLog(@"Tapped"); 
    }