57 votes

UITableViewCell développer sur clic

Disons que nous avons un UITableViewCell personnalisé

Ainsi, chaque fois que je clique sur un bouton personnalisé sur une cellule .. il devrait s’étendre dans une certaine mesure (vous pouvez dire 40 hauteur de plus ...) et lorsque je clique à nouveau sur le même bouton personnalisé, il devrait se réduire à la hauteur précédente.

Le développeur me guide s'il vous plaît .. comment puis-je accomplir cette tâche

97voto

0x7fffffff Points 40133

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
}

75voto

kris Points 1281

Mettre en œuvre heightForRowAtIndexPath pour calculer la bonne hauteur. Puis dans le code de votre bouton, la force de la table de réévaluer chaque cellule de la hauteur avec beginUpdates plus endUpdates:

[self.tableView beginUpdates];
[self.tableView endUpdates];

Des modifications à la tableview cellules hauteurs qui sera calculée automatiquement avec heightForRowAtIndexPath et les modifications seront animés.

En fait, au lieu d'un bouton sur votre téléphone portable qui fait cela, vous pourriez même simplement faire la sélection de la cellule ce faire, dans didSelectRowForIndexPath.

10voto

Mike_NotGuilty Points 294

Au lieu d'utiliser et , j'utilise la méthode à l'intérieur de la méthode.

Je préfère cela, parce que j'ai eu quelques problèmes avec des éléments qui devraient montrer, quand j'étends mon `` , quand j'ai utilisé les méthodes de mises à jour de début et de fin. Un autre point est que vous pouvez choisir entre quelques animations comme: En haut, en bas, à gauche, à droite ...

9voto

Hamid Vakilian Points 11

J'ai créé une bibliothèque open source pour cela. Vous venez d'implémenter collapse et développez les délégués dans votre code et votre alto! vous pouvez également effectuer des dessins et des animations. regarde ça:

https://github.com/xerxes235/HVTableView entrez la description de l'image ici

8voto

gcamp Points 9804

J'ai fabriqué un composant réutilisable qui fera exactement ce dont vous parlez. C'est assez facile à utiliser, et il y a un projet de démonstration.

GCRetractableSectionController sur GitHub.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X