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.

3voto

JaneGoodall Points 391

Dans Swift 4.2 et de nombreuses versions antérieures, au lieu de définir la hauteur du premier en-tête à 0 comme dans les autres réponses, vous pouvez simplement définir les autres en-têtes sur nil. Supposons que vous ayez deux sections et que vous souhaitiez uniquement que la deuxième (c'est-à-dire 1) ait un en-tête. Cet en-tête aura le texte Foobar :

remplacer la fonction override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
    return section == 1 ? "Foobar" : nil
}

2voto

iDev Points 2203

Dans iOS 15, ce code supprime l'espace d'en-tête de section indésirable.

 if #available(iOS 15.0, *) {
  tableView.sectionHeaderTopPadding = .leastNormalMagnitude
}

0voto

Raesu Points 198

Je ne peux pas commenter encore mais je voulais ajouter que si vous avez un UISearchController sur votre contrôleur avec UISearchBar comme votre tableHeaderView, en réglant la hauteur de la première section à 0 dans heightForHeaderInSection fonctionne effectivement.

J'utilise self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height); afin que la barre de recherche soit cachée par défaut.

Le résultat est qu'il n'y a pas d'en-tête pour la première section, et en faisant défiler vers le bas, la barre de recherche apparaîtra juste au-dessus de la première rangée.

0voto

Vilém Kurz Points 2305

Le plus simple est de retourner nil, ou "" dans func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? pour une section où vous ne souhaitez pas afficher l'en-tête.

0voto

mistdon Points 459

Version Swift : Swift 5.1
Généralement, vous pouvez définir la hauteur dans le délégué de tableView de cette manière :

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
   return UIView(frame: CGRect(x: 0, y: 0, width: view.width, height: CGFloat.leastNormalMagnitude))
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
   return CGFloat.leastNormalMagnitude
}

Parfois, lorsque vous avez créé un UITableView avec Xib ou Storyboard, la première solution ne fonctionne pas. Vous pouvez essayer la deuxième solution :

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

En espérant que cela fonctionne pour vous !

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