Comment masquer la première section d'en-tête dans UITableView (regroupés style)
Que la conception de la table de vues à l'aide de l'regroupés style a changé considérablement avec iOS 7, je tiens à cacher (ou supprimer) le premier en-tête de section. Jusqu'à présent, je n'ai pas réussi à l'atteindre.
Quelque 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 sera jamais appelé à la section de l'index 0. Encore un vide en-tête de section est toujours établi avec la hauteur par défaut. (Dans iOS 6, les deux méthodes sont appelées. Toutefois, le résultat est le même.)
Si je retourne une valeur différente, la section d'en-tête obtient la hauteur spécifiée.
Si je retourne à 0,01, c'est presque correct. Cependant, quand je tourne sur la "Couleur Alignées Images" dans le simulateur, il marque l'ensemble de la vue de la table de cellules (ce qui semble être une conséquence logique).
Les réponses à la question UITableView: masquer l'en-tête de section vide semblent indiquer que certaines personnes ont réussi à cacher l'en-tête de section. Mais il pourrait s'appliquer à la plaine de style (au lieu de l'regroupés en un).
Le meilleur compromis jusqu'à présent, c'est de revenir à la hauteur de 0,5, résultant en un peu plus épais ligne en dessous de la barre de navigation. Toutefois, j'apprécierais si quelqu'un sait comment la première section d'en-tête peut être complètement caché.
Mise à jour
Selon caglar'analyse (https://stackoverflow.com/a/19056823/413337), le problème se pose uniquement si le tableau est contenu dans une manette de navigation.
- Je n'ai pas eu la partie => if(section==0) return vue; return nil; c'est à dire le retour d'une vue lorsque ses la première section et de néant, sinon?
- L'idée est de retour d'une vue avec une hauteur de 0 pour le premier article et le retour à néant pour toutes les autres sections de sorte que la vue de la table utilise la valeur par défaut de l'en-tête de la vue pour eux. Le néant en partie bien des œuvres; la vue de la table affiche un en-tête de ces sections. Mais la partie de la section 0 n'est pas pertinent parce que la méthode n'est jamais appelé avec
section == 0
. - Cette réponse semble être court et doux. stackoverflow.com/a/23955420/3965
Vous devez vous connecter pour publier un commentaire.
J'ai une solution qui semble raisonnablement propre à moi. Je suis donc pour répondre à ma propre question.
Depuis 0 comme la première section de l'en-tête hauteur ne fonctionne pas, je retourne 1. Puis-je utiliser le contentInset pour masquer cette hauteur en dessous de la barre de navigation.
Objective-C:
Swift:
CGFLOAT_MIN
au lieu d'une valeur codée en dur. En d'autres termes, ne pasreturn 1.0f
ou0.1f
au lieu de cela,return CGFLOAT_MIN
Si Apple change toujours le minimum acceptable de la valeur, vous aurez un code à modifier si vous le coder en dur la valeur de retour. Aussi, vous avez déjà ne sais pas si vous utilisez la valeur la plus petite possible. À l'aide de la définition de la constante, vous avez la garantie d'être en utilisant la plus petite valeur possible et votre code survivre OS change.return [super tableView:self.tableView titleForHeaderInSection:section];
C'est une façon de masquer la première section d'en-tête dans UITableView (regroupés style).
Swift 3.0 & Xcode 8.0 Solution
La TableView son délégué doit mettre en œuvre les heightForHeaderInSection méthode
Dans le heightForHeaderInSection méthode, retour le moins de nombre positif. (pas zéro!)
CGFLOAT_MIN
pour objc est identique àCGFloat.leastNonzeroMagnitude
dans SwiftLa réponse a été très drôle pour moi et mon équipe, et a travaillé comme un charme
de l'avis de la hiérarchie.
RAISON:
Nous avons observé que cela se produit uniquement pour le Premier Affichage dans la Vue de la Hiérarchie, si ce premier point de vue est un UITableView. Donc, toutes les autres semblables UITableViews n'ont pas cette fâcheuse section, à l'exception de la première. Nous avons Essayé de déplacer la UITableView de la première place dans le point de vue de la hiérarchie, et tout fonctionnait comme prévu.
contentInset
, par exemple,{0, 64, 0, 0}
avoir le 64px décalage à partir du haut (barre d'état, plus de la barre de navigation). La tableView doit être relié à l'écran en haut, pas la topLayoutGuide (pour laisser passer sous la barre de navigation)Utiliser cette astuce pour groupés de type tableView
Copiez et collez code ci-dessous pour votre table dans viewDidLoad méthode:
_tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 0, 1)]
.de cette façon est OK.
Je viens de copier votre code et essayé. Il fonctionne normalement (essayé dans le simulateur). J'ai joint l'affichage du résultat. Vous voulez ce point de vue, non? Ou j'ai mal compris votre problème?
Swift3 : heightForHeaderInSection fonctionne avec 0, vous avez juste à faire en sorte d'en-tête est défini à clipsToBounds.
si vous ne définissez pas clipsToBounds caché en-tête sera visible lors du défilement.
Mise à jour[9/19/17]: Vieille réponse ne fonctionne pas pour moi plus dans iOS 11. Merci Apple. La suite n':
Réponse Précédente:
Posté dans les commentaires par Chris Ostomo la suite fonctionné pour moi:
Ici est de savoir comment se débarrasser de la partie supérieure de la section d'en-tête dans un groupe de UITableView, dans Swift:
Dans Swift 4.2 et beaucoup de versions antérieures, au lieu de mettre le premier en-tête de la hauteur à 0, comme dans les autres réponses, vous pouvez simplement mettre les autres en-têtes de
nil
. Disons que vous avez deux articles et que vous souhaitez uniquement la seconde (c'est à dire,1
) pour avoir un en-tête. Cet en-tête la mention Foobar:Je ne peux rien dire encore, mais j'ai pensé à ajouter que si vous avez un
UISearchController
sur votre contrôleur avecUISearchBar
que votretableHeaderView
, réglage de la hauteur de la première section de 0 àheightForHeaderInSection
ne fonctionne en effet.- Je utiliser
self.tableView.contentOffset = CGPointMake(0, self.searchController.searchBar.frame.size.height);
de sorte que la barre de recherche est masqué par défaut.Résultat est qu'il n'y a pas d'en-tête de la première section, et le défilement vers le bas va montrer la barre de recherche à droite au-dessus de la première rangée.
plus simple et de loin, est de retour
nil
, ou""
dansfunc tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String?
pour une section où vous ne voulez pas afficher l'en-tête.Essayer si vous voulez supprimer tous les en-tête de section complètement