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. .
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)
}
Voici comment masquer le premier en-tête de section dans UITableView (style groupé).
Solution Swift 3.0 & Xcode 8.
Le délégué de TableView doit implémenter la méthode heightForHeaderInSection
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
}
La réponse a été très amusante pour moi et mon équipe, et a travaillé comme un charme
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.
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)];
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 {
...
}
}
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
}
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?
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
}
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))
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
}
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
}
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.
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.