web-dev-qa-db-fra.com

Comment masquer le premier en-tête de section dans UITableView (style groupé)

La conception des vues de table utilisant le style groupé ayant considérablement changé avec iOS 7, je souhaite masquer (ou supprimer) le premier en-tête de section. Jusqu'ici, je n'ai pas réussi à le réaliser.

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 {
        // return some string here ...
    }
}

Si je retourne une hauteur de 0, les deux autres méthodes ne seront jamais appelées avec l'index de section 0. Cependant, 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 la section obtient la hauteur spécifiée.

Si je retourne 0,01, c'est presque correct. Cependant, lorsque j'active "Images mal alignées" dans le simulateur, toutes les cellules de la vue tableau sont marquées (ce qui semble être une conséquence logique).

Les réponses à la question ITableView: masquer l’en-tête de la section vide semblent indiquer que certaines personnes ont réussi à masquer l’en-tête de la section. Mais cela pourrait s’appliquer au style brut (au lieu du style groupé).

Le meilleur compromis jusqu’à présent est de ramener la hauteur à 0,5, ce qui donne une ligne légèrement plus épaisse sous la barre de navigation. Cependant, j'apprécierais que quelqu'un sache comment le premier en-tête de section peut être complètement masqué.

Mettre à jour

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

102
Codo

J'ai une solution de contournement qui me semble raisonnablement propre. Donc, je réponds à ma propre question.

Puisque 0, la hauteur de l'en-tête de la première 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 {
        // return some string here ...
    }
}

- (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)
}
142
Codo

Voici comment masquer le premier en-tête de section dans UITableView (style groupé).

Solution Swift 3.0 & Xcode 8.

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

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

    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    
        let headerHeight: CGFloat
    
        switch section {
        case 0:
            // hide the header
            headerHeight = CGFloat.leastNonzeroMagnitude
        default:
            headerHeight = 21
        }
    
        return headerHeight
    }
    
47
user3378170

La réponse a été très amusante pour moi et mon équipe, et a travaillé comme un charme

  • Dans le Générateur d'interface, il suffit de déplacer la vue table sous une autre vue dans la hiérarchie des vues.

RAISON:

Nous avons observé que cela ne se produit que pour la première vue dans la hiérarchie des vues, si cette première vue est une UITableView. Ainsi, tous les autres UITableViews similaires n'ont pas cette section gênante, à l'exception de la première. Nous avons essayé de déplacer UITableView hors de la première place dans la hiérarchie des vues et tout fonctionnait comme prévu.

36
Giorgos Ath

tilisez cette astuce pour le type table groupView

Copier coller ci-dessous le code de votre vue tableau dans la méthode viewDidLoad :

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

cette façon est OK.

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 {
        ...
    }
}
19
TonnyTao

Swift3: heightForHeaderInSection fonctionne avec 0, vous devez simplement vous assurer que header est défini sur clipsToBounds.

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

si vous ne définissez pas l'en-tête caché clipsToBounds 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
}
6
h.martin

Je viens de copier votre code et essayé. Il fonctionne normalement (essayé en simulateur). J'ai joint la vue résultat. Vous voulez une telle vue, non? Ou j'ai mal compris votre problème?

enter image description here

6
caglar

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

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

Réponse précédente:

Tel que publié dans les commentaires par Chris Ostomo ce qui suit a fonctionné pour moi:

- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
    return CGFLOAT_MIN; // to get rid of empty section header
}
5
Manindra Moharana

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

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

Dans Swift 4.2 et dans de nombreuses versions antérieures, au lieu de définir la hauteur du premier en-tête sur 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 seulement que la seconde (1) ait un en-tête. Cet en-tête aura le texte Foobar:

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

Essayez ceci si vous voulez supprimer complètement tous 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
}
1
Avinash

le plus simple est de loin de retourner nil ou "" dans func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? pour une section dans laquelle vous ne souhaitez pas afficher d’en-tête.

0
Vilém Kurz

Je ne peux pas encore commenter, mais je voudrais ajouter que si vous avez un UISearchController sur votre contrôleur avec UISearchBar comme votre tableHeaderView, définissez la hauteur de la première section sur 0 dans heightForHeaderInSection fonctionne vraiment.

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

Le résultat est qu'il n'y a pas d'en-tête pour la première section et un défilement vers le bas affichera la barre de recherche juste au-dessus de la première ligne.

0
Raesu