Je ne vais pas dire quoi que ce soit ici contredire la accepté de répondre considérant qu'il est parfaitement correct. Cependant, je vais aller plus en détail sur la façon d'accomplir ceci. Si vous ne voulez pas lire tout cela et sont plus intéressés à jouer avec le code source dans un projet de travail, j'ai téléchargé un exemple de projet de Git.
L'idée de base est d'avoir une condition à l'intérieur de la méthode -tableView: heightForRowAtIndexPath:
qui détermine si oui ou non la cellule actuelle devrait être élargi. Ce sera déclenché par l'appel de début/fin des mises à jour sur la table de l'intérieur -tableView: didSelectRowAtIndexPath:
Dans cet exemple, je vais vous montrer comment faire un affichage de tableau qui permet une cellule à l'être élargie à un moment.
La première chose que vous devez faire est de déclarer une référence à un NSIndexPath objet. Vous pouvez le faire quand vous le voulez, mais je vous recommande d'utiliser une déclaration de propriété comme ceci:
@property (strong, nonatomic) NSIndexPath *expandedIndexPath;
REMARQUE: Vous n'avez pas besoin de créer ce chemin d'index à l'intérieur de viewDidLoad, ou de toute autre méthode similaire. Le fait que l'index est initialement nulle signifie seulement que la table n'est pas d'abord avoir un plus grand ligne. Si vous préférez la table de commencer avec une ligne de votre choix élargi, vous pouvez ajouter quelque chose comme ceci à votre méthode viewDidLoad:
NSInteger row = 1;
NSInteger section = 2;
self.expandedIndexPath = [NSIndexPath indexPathForRow:row inSection:section];
La prochaine étape est d'aller sur votre UITableViewDelegate méthode -tableView: didSelectRowAtIndexPath:
pour ajouter la logique de modifier l'étendue de la cellule indice basé sur la sélection des utilisateurs. L'idée ici est de vérifier le chemin d'index qui vient d'être choisi par rapport à l'index de chemin d'accès stockée à l'intérieur de l' expandedIndexPath
variable. Si les deux sont identiques, alors nous savons que l'utilisateur essaie de désélectionner l'élargissement de la cellule dans ce cas, nous avons défini la variable à zéro. Sinon, nous avons mis l' expandedIndexPath
variable pour l'indice qui a été sélectionné. Cela est fait entre les appels à beginUpdates/endUpdates, afin de permettre l'affichage de la table afin de traiter automatiquement l'animation de transition.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView beginUpdates]; // tell the table you're about to start making changes
// If the index path of the currently expanded cell is the same as the index that
// has just been tapped set the expanded index to nil so that there aren't any
// expanded cells, otherwise, set the expanded index to the index that has just
// been selected.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
self.expandedIndexPath = nil;
} else {
self.expandedIndexPath = indexPath;
}
[tableView endUpdates]; // tell the table you're done making your changes
}
Ensuite, l'étape finale est dans un autre UITableViewDelegate méthode -tableView: heightForRowAtIndexPath:
. Cette méthode sera appelée une fois que vous avez déclenché beginUpdates
une fois pour chaque chemin d'index de la table détermine les besoins de mise à jour. C'est là que vous allez comparer le expandedIndexPath
par rapport à l'index de chemin d'accès qui est actuellement en cours de réévaluation.
Si les deux index de chemins d'accès sont les mêmes, alors c'est la cellule que vous souhaitez être élargi, sinon c'est la hauteur doit être normal. J'ai utilisé les valeurs 100 et 44, mais vous pouvez utiliser ce que jamais adapté à vos besoins.
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
// Compares the index path for the current cell to the index path stored in the expanded
// index path variable. If the two match, return a height of 100 points, otherwise return
// a height of 44 points.
if ([indexPath compare:self.expandedIndexPath] == NSOrderedSame) {
return 100.0; // Expanded height
}
return 44.0; // Normal height
}