118 votes

Comment cacher l'en-tête de la première section dans UITableView (style regroupé)

Comme la conception des vues de table utilisant le style groupé a considérablement changé avec iOS 7, je voudrais masquer (ou supprimer) l'en-tête de la première section. Jusqu'à présent, je n'ai pas réussi à le faire.

Un peu simplifié, mon code ressemble à ceci :

- (CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    if (section == 0)
        return 0.0f;
    return 32.0f;
}

- (UIView*) tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        UIView* view = [[UIView alloc] initWithFrame: CGRectMake(0.0f, 0.0f, 640.0f, 0.0f)];
        return view;
    }
    return nil;
}

- (NSString*) tableView:(UITableView *) tableView titleForHeaderInSection:(NSInteger)section
{
    if (section == 0) {
        return nil;
    } else {
        // retourner une chaîne de caractères ici ...
    }
}

Si je retourne une hauteur de 0, les deux autres méthodes ne seront jamais appelées avec l'index de section 0. Pourtant, un en-tête de section vide est toujours dessiné avec la hauteur par défaut. (Dans iOS 6, les deux méthodes sont appelées. Cependant, le résultat visible est le même.)

Si je retourne une valeur différente, l'en-tête de section obtient la hauteur spécifiée.

Si je retourne 0.01, c'est presque correct. Cependant, lorsque j'active "Color Misaligned Images" dans le simulateur, cela marque toutes les cellules de la table de vue (ce qui semble être une conséquence logique).

Les réponses à la question UITableView: hide header from empty section semblent indiquer que certaines personnes ont réussi à cacher l'en-tête de section. Mais cela pourrait s'appliquer au style simple (au lieu du style groupé).

Le meilleur compromis jusqu'à présent est de retourner la hauteur 0.5, ce qui donne une ligne un peu plus épaisse sous la barre de navigation. Cependant, j'apprécierais si quelqu'un sait comment masquer complètement l'en-tête de la première section.

Mise à jour

Selon l'analyse de caglar (https://stackoverflow.com/a/19056823/413337), le problème survient uniquement si la table de vue est contenue dans un contrôleur de navigation.

0voto

rlziii Points 51

Le code suivant a fonctionné pour moi avec iOS 13.6 et Xcode 11.6 avec un UITableViewController qui était intégré dans un UINavigationController:

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    nil
}

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    .zero
}

Aucune autre astuce nécessaire. Les mots clés override ne sont pas nécessaires lorsque l'on n'utilise pas un UITableViewController (c'est-à-dire lorsqu'on implémente simplement les méthodes UITableViewDelegate). Bien sûr, si l'objectif était de masquer uniquement l'en-tête de la première section, alors cette logique pourrait être encapsulée dans une condition comme ceci :

override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    if section == 0 {
        return nil
    } else {
        // Retourner une autre vue...
    }
}

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return .zero
    } else {
        // Retourner une autre hauteur...
    }
}

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