J'essaye de créer un uitableviewcell de type accordéon qui, lorsque l'utilisateur sélectionne la cellule, l'agrandit pour afficher une vue détaillée en ligne similaire à celle de l'application digg. J'ai d'abord essayé de remplacer le tablecell actuel avec une cellule personnalisée dans cellForRowAtIndex mais l'animation semble un peu saccadée car vous pouvez voir la cellule en cours de remplacement et globalement l'effet ne fonctionne pas bien.Cellule de table d'accordéon - Comment agrandir/contracter dynamiquement uitableviewcell?
Si vous regardez l'application digg et d'autres qui ont fait cela, il semble qu'ils ne remplacent pas la cellule actuelle, mais plutôt en ajoutant peut-être une sous-vue à la cellule? La cellule d'origine ne semble cependant pas animer du tout et seule la nouvelle vue s'accorde dans la table.
Est-ce que quelqu'un a des idées pour accomplir un effet similaire?
Mise à jour: J'ai fait quelques progrès en utilisant la méthode de Neha ci-dessous et alors que la cellule est Animer le bon sens, il est en train de causer des ravages avec les autres cellules du tableau. Ce que j'ai fait est sous-classé UITableViewCell avec une classe personnalisée qui contient une instance d'un UIView qui dessine réellement la vue que j'ajoute ensuite au contenu de la table.
- (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);
}
Voici toutes les tables méthodes de délégués: J'UTILISE
- (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;
}
Il semble maintenant que la cellule est en pleine expansion, mais pas réellement rafraîchi de sorte que les étiquettes et textfield ne coûtent pas être représentés. Ils apparaissent cependant quand je fais défiler la cellule et sur l'écran.
Des idées?
quelqu'un? Vous ne cherchez pas de code détaillé, mais plutôt quelques lignes directrices sur la façon d'y parvenir? –
Pourquoi ne faites-vous pas répondre à la bonne réponse de Pawel ... Vous ne pouvez pas aller mieux que ça. –