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.

160voto

Codo Points 28685

Je me suis débrouillé pour trouver une solution qui me semble raisonnablement propre. Donc, je réponds à ma propre question.

Étant donné que 0 comme hauteur de l'en-tête de section ne fonctionne pas, je retourne 1. Ensuite, j'utilise le contentInset pour masquer cette hauteur sous la barre de navigation.

Objective-C :

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

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

- (void) viewDidLoad
{
    [super viewDidLoad];

     self.tableView.contentInset = UIEdgeInsetsMake(-1.0f, 0.0f, 0.0f, 0.0);
}

Swift :

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return section == 0 ? 1.0 : 32
}

override func viewDidLoad() {
    super.viewDidLoad()

    tableView.contentInset = UIEdgeInsets(top: -1, left: 0, bottom: 0, right: 0)
}

57voto

user3378170 Points 1

C'est ainsi que l'on cache l'en-tête de la première section dans UITableView (style groupé).

Solution Swift 3.0 & Xcode 8.0

  1. Le délégué de la TableView doit implémenter la méthode heightForHeaderInSection

  2. Dans la méthode heightForHeaderInSection, retournez le nombre le moins positif. (pas zéro!)

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // cacher l'en-tête
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }

36voto

Giorgos Ath Points 185

La réponse était très drôle pour moi et mon équipe, et a parfaitement fonctionné

  • Dans l'Interface Builder, déplacez simplement le tableview sous une autre vue dans la hiérarchie des vues.

RAISON:

Nous avons observé que cela se produit uniquement pour la première vue dans la hiérarchie des vues, si cette première vue est une UITableView. Ainsi, toutes les autres UITableView similaires n'ont pas cette section ennuyeuse, sauf la première. Nous avons essayé de déplacer la UITableView hors de la première place dans la hiérarchie des vues, et tout fonctionnait comme prévu.

26voto

Nitesh Borad Points 242

Utilisez cette astuce pour les tableView de type groupé

Copiez-collez le code suivant pour votre table view dans la méthode viewDidLoad:

tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tableView.bounds.size.width, 0.01f)];

22voto

TonnyTao Points 472

Ce chemin est correct.

override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    if section == 0 {
        return CGFloat.min
    }
    return 25
}

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

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