Comme la conception des vues de tableau utilisant le style groupé a considérablement changé avec iOS 7, je voudrais masquer (ou supprimer) le premier en-tête de section. Jusqu'à présent, je n'ai pas réussi à y parvenir.
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 renvoie 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 renvoie une valeur différente, l'en-tête de section obtient la hauteur spécifiée.
Si je renvoie 0,01, c'est presque correct. Cependant, lorsque j'active "Couleur des images mal alignées" dans le simulateur, cela marque toutes les cellules de la vue tableau (ce qui semble être une conséquence logique).
Les réponses à la question UITableView: 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 peut s'appliquer au style simple (au lieu du style groupé).
Le meilleur compromis jusqu'à présent est de renvoyer la hauteur 0,5, ce qui donne une ligne un peu 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 caché.
Mettre à jour
Selon l' analyse de caglar ( https://stackoverflow.com/a/19056823/413337 ), le problème ne survient que si la vue de table est contenue dans un contrôleur de navigation.
la source
section == 0
.Réponses:
J'ai une solution de contournement qui me semble raisonnablement propre. Alors je réponds à ma propre question.
Puisque 0 comme 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.
Objectif c:
Rapide:
la source
CGFLOAT_MIN
au lieu d'une valeur codée en dur. En d'autres termes, ne le faites pasreturn 1.0f
ou à la0.1f
place,return CGFLOAT_MIN
si Apple change un jour la valeur minimale acceptable, vous aurez du code à changer si vous codez en dur la valeur de retour. De plus, vous ne savez déjà pas si vous utilisez la plus petite valeur possible. En utilisant la constante définie, vous êtes assuré d'utiliser la plus petite valeur possible et votre code survivra aux modifications du système d'exploitation.Voici comment masquer le premier en-tête de section dans UITableView (style groupé).
Solution Swift 3.0 et Xcode 8.0
Le délégué de TableView doit implémenter la méthode heightForHeaderInSection
Dans la méthode heightForHeaderInSection, renvoie le nombre le moins positif. (pas zéro!)
la source
CGFLOAT_MIN
pour objc est identique àCGFloat.leastNonzeroMagnitude
dans SwiftLa réponse était très drôle pour moi et mon équipe et a fonctionné comme un charme
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 un UITableView . Donc, tous les autres UITableViews similaires n'ont pas cette section ennuyeuse, sauf la première. Nous avons essayé de déplacer UITableView de la première place dans la hiérarchie des vues, et tout fonctionnait comme prévu.
la source
contentInset
par exemple définir le sur pour{0, 64, 0, 0}
avoir le décalage de 64 pixels par rapport au haut (barre d'état plus barre de navigation). Le tableView doit être attaché en haut de l'écran, pas le topLayoutGuide (pour le laisser atteindre sous la barre de navigation)Utilisez cette astuce pour la table de type groupé
Copiez-collez le code ci-dessous pour votre vue de table dans la méthode viewDidLoad :
la source
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
.cette façon est OK.
la source
J'ai juste copié votre code et essayé. Il fonctionne normalement (essayé en simulateur). J'ai joint la vue des résultats. Vous voulez une telle vue, non? Ou j'ai mal compris votre problème?
la source
Swift3: heightForHeaderInSection fonctionne avec 0, il vous suffit de vous assurer que l'en-tête est défini sur clipsToBounds.
si vous ne définissez pas l'en-tête masqué clipsToBounds, il sera visible lors du défilement.
la source
Mise à jour [19/09/17]: l'ancienne réponse ne fonctionne plus pour moi dans iOS 11. Merci Apple. Ce qui suit a fait:
Réponse précédente:
Comme indiqué dans les commentaires de Chris Ostomo, ce qui suit a fonctionné pour moi:
la source
Voici comment se débarrasser de l'en-tête de section supérieur dans un UITableView groupé, dans Swift:
la source
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 ne souhaitiez que la seconde (c'est-à-dire1
) avoir un en-tête. Cet en-tête contiendra le texte Foobar :la source
Essayez ceci si vous souhaitez supprimer complètement tous les en-têtes de section
la source
Je ne peux pas encore commenter mais j'ai pensé ajouter que si vous avez un
UISearchController
sur votre contrôleur avecUISearchBar
comme vôtretableHeaderView
, définir la hauteur de la première section sur 0 dansheightForHeaderInSection
fonctionne effectivement.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 le défilement vers le bas affichera la barre de recherche juste au-dessus de la première ligne.
la source
le plus simple est de loin de retourner
nil
, ou""
dansfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
une section où vous ne souhaitez pas afficher l'en-tête.la source
Version Swift: Swift 5.1 La
plupart du temps, vous pouvez définir la hauteur dans le délégué tableView comme ceci:
Parfois, lorsque vous avez créé UITableView avec Xib ou Storyboard, la réponse de up ne fonctionne pas. vous pouvez essayer la deuxième solution:
J'espère que ça marche pour toi!
la source