60 Stimmen

Akkordeon-Tabelle Zelle - Wie dynamisch erweitern/zusammenziehen uitableviewcell?

Ich versuche, ein Akkordeon Art von uitableviewcell zu erstellen, die, wenn der Benutzer die Zelle auswählt, es erweitert, um eine detaillierte Info-Ansicht inline ähnlich wie die Digg-App funktioniert anzuzeigen. Ich habe zunächst versucht, die aktuelle tablecell mit einem customcell in cellForRowAtIndex zu ersetzen, aber die Animation sieht ein bisschen abgehackt, wie Sie die Zelle ersetzt und insgesamt der Effekt nicht zu gut funktioniert.

Wenn Sie sich die Digg-App und andere ansehen, die dies getan haben, scheint es, dass sie die aktuelle Zelle nicht ersetzen, sondern vielleicht eine Unteransicht zu der Zelle hinzufügen? Die ursprüngliche Zelle scheint jedoch nicht zu animieren überhaupt und nur die neue Ansicht Akkordeons in die Tabelle.

Hat jemand eine Idee, wie man einen ähnlichen Effekt erzielen kann?

Ich habe einige Fortschritte mit Neha's Methode unten gemacht und während die Zelle die richtige Art und Weise animiert, ist es Verwüstung mit den anderen Zellen in der Tabelle zu tun. Was ich getan habe, ist subclassed UITableViewCell mit einer benutzerdefinierten Klasse, die eine Instanz eines UIView enthält, die tatsächlich die Ansicht zeichnet, die ich dann zum Contentview der Tabellenzelle hinzufügen.

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {

if (selected) { 
    [self expandCell];
}
}

-(void)expandCell { 
    self.contentView.frame = CGRectMake(0.0, 0.0, self.contentView.bounds.size.width, 110);
}

Hier sind alle Methoden der Tabellendelegierten, die ich verwende:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

if (isSearching && indexPath.row == selectedIndex) {

    static NSString *CellIdentifier = @"SearchCell";
    CustomTableCell *cell = (CustomTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    [cell setCustomTitle:[timeZoneNames objectAtIndex:indexPath.row] detail:[timeZoneNames objectAtIndex:indexPath.row]];

    UILabel *theText = [[UILabel alloc] initWithFrame:CGRectMake(10.0, 10.0, cell.contentView.bounds.size.width -20, 22.0)];
    theText.text = @"Title Text";
    [cell.contentView addSubview:theText];

    UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(10.0, 10 + 46.0, cell.contentView.bounds.size.width - 20, 40.0)];
    textField.borderStyle = UITextBorderStyleLine;
    [cell.contentView addSubview:textField];        

    UILabel *testLabel = [[UILabel alloc] initWithFrame:CGRectMake(5.0, 88.0, cell.contentView.bounds.size.width - 20, 22.0)];
    testLabel.text = [NSString stringWithFormat:@"Some text here"];
    [cell.contentView addSubview:testLabel];

    [theText release];
    [textField release];
    [testLabel release];

    return cell;        
} else {

    static NSString *CellIdentifier = @"Cell";
    CustomTableCell *cell = (CustomTableCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[CustomTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    [cell setCustomTitle:[timeZoneNames objectAtIndex:indexPath.row] detail:[timeZoneNames objectAtIndex:indexPath.row]];
    return cell; 
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

[tableView deselectRowAtIndexPath:indexPath animated:NO];   

selectedIndex = indexPath.row;
isSearching = YES;

[tableView beginUpdates];
[tableView endUpdates];

}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {        
if (isSearching && indexPath.row == selectedIndex) {
    return 110;
}
return rowHeight;           
} 

Es scheint jetzt, dass die Zelle erweitert, aber nicht tatsächlich aktualisiert wird, so dass die Beschriftungen und das Textfeld nicht angezeigt werden. Sie zeigen jedoch, wenn ich die Zelle aus und auf dem Bildschirm blättern.

Irgendwelche Ideen?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X