Ich versuche, einen Akkordeon-Typ von uitableviewcell zu erstellen, der, wenn der Benutzer die Zelle auswählt, so erweitert wird, dass eine detaillierte Infoansicht ähnlich der Funktionsweise der digg-App angezeigt wird. Ich habe anfangs versucht, die aktuelle Tabellenzelle durch eine benutzerdefinierte Zelle in cellForRowAtIndex zu ersetzen, aber die Animation sieht etwas abgehackt aus, da man sehen kann, dass die Zelle ersetzt wurde und der Effekt insgesamt nicht gut funktioniert.Akkordeon-Tabelle Zelle - Wie dynamisch expandit/contract uitableviewcell?
Wenn Sie sich die Digg-App und andere, die dies getan haben, sehen, scheint es, dass sie die aktuelle Zelle nicht ersetzen, sondern vielleicht eine Unteransicht der Zelle hinzufügen? Die ursprüngliche Zelle scheint jedoch überhaupt nicht zu animieren und nur die neue Ansicht akkordeoniert in die Tabelle.
Hat jemand irgendwelche Ideen, wie man einen ähnlichen Effekt erzielt?
Update: Ich habe einige Fortschritte mit neha Methode unten gemacht und während die Zelle die richtige Art und Weise Animieren es Chaos mit den anderen Zellen in der Tabelle anzurichten. Was ich getan habe, ist subclassed UITableViewCell mit einer benutzerdefinierten Klasse, die eine Instanz einer UIView enthält, die tatsächlich die Ansicht zeichnet, die ich dann der Inhaltsansicht der Tabellenzellen hinzufüge.
- (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 Tabellen Delegatmethoden 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 nun, dass die Zelle erweitert, aber nicht tatsächlich aktualisiert werden, so dass die Etiketten und Textfeld Arent gezeigt wird. Sie erscheinen jedoch, wenn ich die Zelle ab und auf dem Bildschirm scrolle.
Irgendwelche Ideen?
jemand ändern? Sie suchen keinen detaillierten Code, sondern nur einige Richtlinien, wie Sie dies erreichen können? –
Warum machst du Pawels Antwort nicht die richtige Antwort ... Du kannst nicht besser werden. –