2011-04-06 4 views
0

J'essaie de créer une table avec une cellule sur laquelle je peux cliquer, puis je grossis pour afficher toutes les informations. Cela fonctionne jusqu'à présent avec le code suivantRétraction de la cellule de vue Table avec didSelectRowAtIndexPath

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Note: Some operations like calling [tableView cellForRowAtIndexPath:indexPath] 
    // will call heightForRow and thus create a stack overflow 
    if(selectedCellIndexPath != nil 
     && [selectedCellIndexPath compare:indexPath] == NSOrderedSame){ 
    labelSize = [[items objectAtIndex:indexPath.row] sizeWithFont:[UIFont fontWithName:@"Helvetica" size:13.0] 
         constrainedToSize:CGSizeMake(220.0f, MAXFLOAT) 
          lineBreakMode:UILineBreakModeWordWrap]; 
    return labelSize.height + 40; 
    } 
    return 68; 
} 

Ceci fonctionne très bien et agrandit la cellule. Mais il n'y a aucun moyen de fermer la cellule. J'ai essayé de lire, dans ce cas le labelSize.heigth, mais cela ne correspond pas à la hauteur réelle de la cellule cliquée.

Est-ce que quelqu'un connaît un bon moyen de fermer une cellule, ou en d'autres termes. Lorsque la cellule est tapée la deuxième fois, il faut régler la hauteur de 68.

Merci!

Répondre

0

Vous pouvez vérifier votre variable d'instance CellIndexPath sélectionnée.

Ou quelque chose comme ça si vous voulez sélection multiple:

NSMutableSet *_selectedIndexPaths; 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    CGFloat height = 68.0f; 

    if ([_selectedIndexPaths containsObject:indexPath]) { 
     height *= 2.0f; 
    } 

    return height; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([_selectedIndexPaths containsObject:indexPath]) { 
     [_selectedIndexPaths removeObject:indexPath]; 
    } else { 
     [_selectedIndexPaths addObject:indexPath]; 
    } 

    [UIView animateWithDuration:0.35 
          delay:0.0 
         options:UIViewAnimationOptionLayoutSubviews 
        animations:^{ 
         [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];       
        } 
        completion:NULL]; 
} 
0

je ferais ce commentaire sur la réponse de Phil Larson, mais le code multiligne dans les commentaires ne fonctionne pas très bien.

Dans le passé, au moins, Apple recommandait d'utiliser un bloc beginUpdates/endUpdates vide pour obtenir le redimensionnement des cellules animées. C'est la première fois que j'ai vu UIView animations utilisées pour obtenir le même effet. J'ai utilisé la technique dans mon propre code. Du code Phil, je remplace le [UIView animateWithDuration... avec ce qui suit

[tableView beginUpdates]; 
[tableView endUpdate]; 

Si je me trompe et il y a une nouvelle recommandation d'utiliser l'animation UIView, je serais curieux de voir la discussion de celui-ci. Je n'aurais pas pensé à aller avec cette approche.

Questions connexes