213 votes

Le paramètre Hauteur de cellule personnalisée dans le storyboard ne répond pas

Je suis en train de régler la hauteur de la cellule de l'une des cellules sur ma table. Je suis réglage de la taille de la "hauteur de ligne" configuration à l'intérieur de la "taille de l'inspecteur" de la cellule en question. Quand je lance l'appli sur mon iPhone la cellule a la taille par défaut définie à partir de la ligne "taille" dans le tableau.

Si je modifier la taille de la ligne" de la vue de la table, alors la taille de tous les changements des cellules. Je ne veux pas le faire car je veux une taille personnalisée pour une seule cellule. J'ai vu beaucoup de posts qui ont un programmatique solution au problème, mais je préfère le faire à travers un storyboard, lorsque cela est possible.

296voto

pixelfreak Points 7385

Sur les cellules dynamiques , rowHeight défini sur UITableView remplace toujours rowHeight des cellules individuelles.

Mais sur les cellules statiques , rowHeight défini sur des cellules individuelles peut remplacer les UITableView.

Vous ne savez pas si c'est un bug, Apple pourrait intentionnellement faire cela?

84voto

Beber Points 768

si vous utilisez UITableViewController, implémentez cette méthode:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; 
 

En fonction de la ligne, vous pouvez choisir la hauteur, par exemple:

 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{
    if (indexPath.row == 0) {
       return 100;
    } else {
       return 60;
    }
}
 

Dans cet exemple, la hauteur de la première rangée = 100px, et les autres 60px.

J'espère que celui-ci peut vous aider.

34voto

Michael G. Emmons Points 16681

Pour la dynamique des cellules, rowHeight ensemble sur l' UITableView a toujours la priorité sur les cellules individuelles' rowHeight.

Ce comportement est, IMO, un bug. À tout moment, vous avez à gérer votre INTERFACE utilisateur en deux endroits, elle est sujette à l'erreur. Par exemple, si vous changez la taille des cellules dans la table de montage, vous devez vous rappeler de les modifier dans l' heightForRowAtIndexPath: . Jusqu'à ce qu'Apple corrige le bug actuel, la meilleure solution est de remplacer heightForRowAtIndexPath:, mais utiliser le prototype de cellules à partir de la table de montage séquentiel pour déterminer la hauteur plutôt que d'utiliser des numéros de magie. Voici un exemple:

- (CGFloat)tableView:(UITableView *)tableView 
           heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    /* In this example, there is a different cell for
       the top, middle and bottom rows of the tableView.
       Each type of cell has a different height.
       self.model contains the data for the tableview 
    */
    static NSString *CellIdentifier;
    if (indexPath.row == 0) 
        CellIdentifier = @"CellTop";
    else if (indexPath.row + 1 == [self.model count] )
        CellIdentifier = @"CellBottom";
    else
        CellIdentifier = @"CellMiddle";

    UITableViewCell *cell = 
              [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    return cell.bounds.size.height;
}

Cela permettra de s'assurer que toutes les modifications apportées à votre prototype de la hauteur de cellule sera automatiquement repris au moment de l'exécution et que vous n'avez besoin de gérer votre INTERFACE utilisateur en un seul lieu: le storyboard.

22voto

JosephH Points 21074

J'ai construit le code avec les différentes réponses / commentaires afin que cela fonctionne pour les storyboards qui utilisent des cellules prototypes.

Ce code:

  • Ne nécessite pas que la hauteur de la cellule soit définie ailleurs que dans l'emplacement évident du storyboard
  • Met en cache la hauteur pour des raisons de performances
  • Utilise une fonction commune pour obtenir l'identificateur de cellule pour un chemin d'index afin d'éviter la logique dupliquée

Merci à Answerbot, Brennan et lensovet.

 - (NSString *)cellIdentifierForIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = nil;

    switch (indexPath.section)
    {
        case 0:
            cellIdentifier = @"ArtworkCell";
            break;
         <... and so on ...>
    }

    return cellIdentifier;
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];
    static NSMutableDictionary *heightCache;
    if (!heightCache)
        heightCache = [[NSMutableDictionary alloc] init];
    NSNumber *cachedHeight = heightCache[cellIdentifier];
    if (cachedHeight)
        return cachedHeight.floatValue;

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
    CGFloat height = cell.bounds.size.height;
    heightCache[cellIdentifier] = @(height);
    return height;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSString *cellIdentifier = [self cellIdentifierForIndexPath:indexPath];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

    <... configure cell as usual...>
 

20voto

Kristjan H. Points 124

Il y a en fait deux endroits où vous devez changer la hauteur de la rangée, d'abord la cellule (vous avez déjà changé cela) et maintenant, sélectionnez la vue Table et vérifiez l'inspecteur de taille

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