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.

6voto

caglar Points 649

J'ai simplement copié votre code et essayé. Il s'exécute normalement (testé dans le simulateur). J'ai joint la vue du résultat. Vous voulez une telle vue, n'est-ce pas? Ou ai-je mal compris votre problème?

entrer la description de l'image ici

6voto

h.martin Points 61

Swift3 : heightForHeaderInSection fonctionne avec 0, il suffit de s'assurer que l'en-tête est défini sur clipsToBounds.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
       return 0
}

si vous ne définissez pas clipsToBounds, l'en-tête masqué sera visible lors du défilement.

func tableView(_ tableView: UITableView, willDisplayHeaderView view: UIView, forSection section: Int) {
    guard let header = view as? UITableViewHeaderFooterView else { return }

    header.clipsToBounds = true
}

5voto

Manindra Moharana Points 884

Mise à jour [19/09/17]: L'ancienne réponse ne fonctionne plus pour moi sous iOS 11. Merci Apple. La suivante a fonctionné:

self.tableView.sectionHeaderHeight = UITableViewAutomaticDimension;
self.tableView.estimatedSectionHeaderHeight = 20.0f;
self.tableView.contentInset = UIEdgeInsetsMake(-18.0, 0.0f, 0.0f, 0.0);

Ancienne réponse:

Comme indiqué dans les commentaires par Chris Ostomo, la solution suivante a fonctionné pour moi:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // pour se débarrasser de l'en-tête de section vide
}

5voto

Harris Points 916

Voici comment se débarrasser de l'en-tête de section supérieure dans un UITableView groupé, en Swift:

tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: 0, height: CGFloat.leastNormalMagnitude))

4voto

Avinash Points 1086

Essayez ceci si vous voulez supprimer complètement toutes les en-têtes de section

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

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

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