À partir de iOS7, il y a de l'espace supplémentaire en haut de mes UITableView
qui ont un style UITableViewStyleGrouped
.
Voici un exemple:
La table commence par la première flèche, il y a 35 pixels de remplissage non expliqué, puis l'en-tête vert est un UIView
renvoyé par viewForHeaderInSection
(où la section est 0).
Quelqu'un peut-il expliquer d'où provient cette quantité de 35 pixels et comment je peux m'en débarrasser sans passer à UITableViewStylePlain
?
J'ai trouvé la cause de mon bogue d'origine et créé un exemple de projet le présentant. Je crois qu'il y a un bug iOS7.
À partir de iOS7, si vous créez une UITableView avec le style Groupé, mais qu'aucun délégué ne soit défini sur la première disposition, définissez un délégué et appelez reloadData. Un espace de 35px en haut ne disparaîtra jamais.
Voir ce projet que j'ai réalisé en présentant le bogue: https://github.com/esilverberg/TableViewDelayedDelegateBug
Plus précisément, ce fichier: https://github.com/esilverberg/TableViewDelayedDelegateBug/blob/master/TableViewDelayedDelegateBug/ViewController.m
Si la ligne 24 est active,
[self performSelector:@selector(updateDelegate) withObject:nil afterDelay:0.0];
il y aura un espace supplémentaire de 35 px en haut. Si la ligne 27 est active et que 24 est commentée,
self.tableView.delegate = self;
pas d'espace en haut. C'est comme si tableView mettait en cache un résultat quelque part et ne se redéfinissait pas une fois que le délégué avait été défini et que reloadData avait été appelé.
J'ai joué un peu plus avec cela et il semble que c'est un effet secondaire de régler le tableHeaderView = nil
de la tableView.
Parce que mon tableView a une tableHeaderView
qui apparaît dynamiquement, lorsque je dois masquer la tableHeaderView
, au lieu de self.tableView.tableHeaderView = nil;
, je fais:
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, self.tableView.bounds.size.width, 0.01f)];
J'aime mieux cette solution que de définir un contentInset.top
quelque peu arbitraire, car j’utilise également le contentInset.top
de manière dynamique. Il est fastidieux de devoir supprimer un 35px supplémentaire chaque fois que je recalcule contentInset.top
.
Pour IOS 7, si vous allouez une vue de table dans un contrôleur de vue, consultez
self.edgesForExtendedLayout = UIRectEdgeNone;
ton problème semblait semblable au mien
Mettre à jour:
Swift dans iOS 9.x:
self.edgesForExtendedLayout = UIRectEdge.None
Swift 3:
self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
Essayez de changer la propriété contentInset
dont UITableView
hérite de UIScrollView
.
self.tableView.contentInset = UIEdgeInsetsMake(-36, 0, 0, 0);
C'est une solution de contournement, mais ça marche
self.automaticallyAdjustsScrollViewInsets = NO;
essayez, vous pouvez y faire face!
Vous pouvez détecter si votre application exécute iOS7 ou une version ultérieure et ajouter ces deux méthodes à votre délégué de vue table (généralement dans votre code UIViewController).
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
return CGFLOAT_MIN;
}
Ce n'est peut-être pas une solution élégante mais fonctionne pour moi
Version Swift:
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
Autre commentaire rapide ... même dans XCode 6.1, il existe un bogue avec des espaces verticaux apparaissant en haut de UIScrollViews
, UITextViews
et UITableViews
.
Parfois, le seul moyen de résoudre ce problème consiste à accéder au Storyboard et à faire glisser le contrôle du problème afin qu'il ne soit plus la sous-vue first de la page.
(Mes remerciements à Oded pour m'avoir orienté dans cette direction ... Je poste ce commentaire, juste pour ajouter quelques captures d'écran, pour illustrer les symptômes et résoudre le problème.)
Selon ce Guide de transition pour iOS7 d’Apple, le contenu de la vue de défilement est ajusté automatiquement. La valeur par défaut de automaticAdjustsScrollViewInsets est définie sur YES.
UIViewController qui possède UITableView doit définir cette propriété sur NO.
self.automaticallyAdjustsScrollViewInsets = NO;
Ça fera l'affaire.
EDIT 1:
En outre, on pourrait essayer -
self.navigationController.navigationBar.translucent = YES;
Cela supprime également le rembourrage supplémentaire sur le dessus.
Lorsque vous utilisez GroupView TableView, utilisez cette option pour éviter la découpe de la bordure dans viewWillAppear.
self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Beaucoup des réponses précédentes ci-dessus sont trop compliquées. Si Apple décidait de remédier à ce problème inattendu, ils se dissoudraient à tout moment.
Racine de la question:
un UITableView
n'aime pas avoir un en-tête avec une hauteur de 0.0. Si ce que vous essayez de faire est d'avoir un en-tête de hauteur 0, vous pouvez passer directement à la solution.
même si, ultérieurement, vous assignez une hauteur différente de 0.0 à votre en-tête, une UITableView
n'aime pas se voir attribuer un en-tête d'une hauteur de 0.0 au début.
Solution:
Ensuite, le correctif le plus simple et le plus fiable consiste à vérifier que la hauteur de votre en-tête n'est pas égale à 0 lorsque vous l'attribuez à votre vue tabulaire.
Quelque chose comme ça marcherait:
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.tableView.bounds.size.width, CGFLOAT_MIN)];
self.tableView.tableHeaderView = tableViewHeaderView;
Quelque chose comme ceci conduirait à la question à un moment donné (généralement, après un parchemin):
// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Storyboard:
Décochez simplement: Adjust Scroll View Insets
dans les options de View Controller
Code:
self.automaticallyAdjustsScrollViewInsets = false
Voici la solution pour iOS 10 utilisant Swift 3:
Vous pouvez vous débarrasser des marges supérieures et inférieures en implémentant les méthodes suivantes à partir de UITableViewDelegate
.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
return CGFloat.leastNormalMagnitude
}
Dans mon cas, c'est ce qui m'a aidé. Je soutiens ios6 également.
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = NO;
self.automaticallyAdjustsScrollViewInsets = NO;
}
J'essayais donc toutes les méthodes ici, et cette fois, aucune d'entre elles n'a aidé. Mon cas était une vue de table groupée sur iOS 9. Je ne sais pas vraiment pourquoi ni comment j'ai découvert celle-ci, mais pour moi, définir la tableViewHeader
avec une UIView
avec au moins 0.01
hauteur a été établie. CGRectZero
n'a pas aidé, rien n'a vraiment aidé:
tableView.tableHeaderView = UIView(frame: CGRect(x: 0.0, y: 0.0, width: 0.0, height: 0.01))
Ajoutez simplement les éléments suivants à votre viewDidLoad dans votre VC:
self.automaticallyAdjustsScrollViewInsets = NO;
Merci à la réponse de @Aurelien Porte. Voici ma solution
Cause de ce problème: -
Dans ViewDidLoad: -
self.edgesForExtendedLayout = UIRectEdge.None
self.automaticallyAdjustsScrollViewInsets = false
Pas besoin de quelque chose comme ça: -
self.myTableview.contentInset = UIEdgeInsetsMake(-56, 0, 0, 0)
En heightForHeaderInSection
délégué: -
if section == 0
{
return 1
}
else
{
return 40; // your other headers height value
}
En viewForHeaderInSection
délégué: -
if section == 0
{
// Note CGFloat.min for Swift
// For Objective-c CGFLOAT_MIN
let headerView = UIView.init(frame: CGRectMake(0.0, 0.0, self.myShaadiTableview.bounds.size.width, CGFloat.min))
return headerView
}
else
{
// Construct your other headers here
}
Swift: iOS j'avais vue de la table sur la vue de défilement .. quand je cliquais sur "Retour" sur le même écran. Faites défiler la vue prendre plus d'espace en haut .. pour résoudre ce problème, j'ai utilisé:
self.automaticallyAdjustsScrollViewInsets = false
Valeur booléenne indiquant si le contrôleur de vue doit ajuster automatiquement ses encoches de vue de défilement . La valeur par défaut est true, ce qui lui permet d'ajuster ses encarts de vue de défilement en réponse aux zones d'écran utilisées par la barre d'état, barre de navigation , et barre d'outils ou barre d'onglets. Définissez la valeur sur false si vous souhaitez gérer vous-même les réglages de l'encadré de la vue de défilement, par exemple lorsqu'il y a plusieurs vues de défilement dans la hiérarchie des vues.
Ma réponse sera une réponse plus générale, mais peut également s'appliquer à cela.
Si la vue racine (de ViewController) ou premier enfant (sous-vue) de la vue racine est la sous-classe de UIScrollView (ou de UIScrollView lui-même),
self.navigationController.navigationBar.translucent = YES;
framework définira automatiquement pré-calculé contentInset.
Pour éviter cela, vous pouvez faire
self.automaticallyAdjustsScrollViewInsets = NO;
mais dans mon cas, je n'ai pas pu le faire, car je mettais en œuvre le SDK qui contient un composant UIView qui peut être utilisé par d'autres développeurs. Ce composant UIView contient UIWebView (qui a UIScrollView comme première sous-vue). Si ce composant est ajouté en tant que premier enfant dans la hiérarchie de vues UIViewController, des encarts automatiques seront appliqués par le système.
J'ai résolu ce problème en ajoutant dummy view avec frame (0,0,0,0) avant d'ajouter UIWebView.
Dans ce cas, le système n'a pas trouvé la sous-classe de UIScrollView en tant que première sous-vue et n'a pas appliqué d'encarts.
Je suppose que cela fait partie du nouveau style UITableViewStyleGrouped
. C'est dans toutes les vues de table groupées et il ne semble pas y avoir de moyen direct de contrôler cet espace.
Si cet espace est représenté par une UIView
, il serait possible de rechercher dans toute la subviews
de la UITableView
afin de trouver cette vue spécifique et de la modifier directement. Cependant, il est également possible que cet espace ne soit qu'un décalage codé en dur avant le début des en-têtes et des cellules et qu'il n'y aura aucun moyen de le modifier.
Pour effectuer une recherche dans toutes les sous-vues (je voudrais exécuter ce code lorsque la table n'a pas de cellules, afin de faciliter la lecture du résultat):
- (void)listSubviewsOfView:(UIView *)view {
// Get the subviews of the view
NSArray *subviews = [view subviews];
// Return if there are no subviews
if ([subviews count] == 0) return;
for (UIView *subview in subviews) {
NSLog(@"%@", subview);
// List the subviews of subview
[self listSubviewsOfView:subview];
}
}
Voici comment le réparer facilement dans iOS 11 et Xcode 9.1 via Storyboard:
Sélectionnez Vue tableau> Inspecteur de taille> Encarts de contenu: jamais
Je pense que faire UIEdgeInsets -35 0 0 0 est fastidieux. Dans mon cas, j'ai implémenté la méthode tableView: heightForHeaderInSection: et il a le potentiel de retourner 0.
Quand j'ai changé 0 à 0.1f, le problème est parti.
J'ai eu le même correctif que Arielyz. Une fois que j'ai déplacé UITableView pour qu'il ne soit plus la première sous-vue de la vue parente, il est parti. Mon espace était 20 px, pas 35.
Je ne pouvais pas le recréer dans un portrait xib, seulement un paysage xib. Je signalerai un bug radar plus tard si je peux le reproduire dans une simple application de démonstration.
override func viewWillAppear(animated: Bool) {
self.edgesForExtendedLayout = UIRectEdge.None
// OR
self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
//OR
self.automaticallyAdjustsScrollViewInsets = false
}
La seule chose qui a fonctionné pour moi a été:
Rapide :
tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0
Objectif c :
self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;
De plus, il me restait encore un espace supplémentaire pour la première section. C'était parce que j'utilisais la propriété tableHeaderView
de manière incorrecte. Corrigé cela aussi en ajoutant:
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
utiliser celui-ci je pense que cette aide ...
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return 0.005f;// set this according to that you want...
}
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
C'est tout les gens!
Nous avons plusieurs réponses à cela.
1) Vous pouvez ajouter UIImageview à view didload
UIImageView * imbBackground = [UIImageView new];
[self.view addSubview:imbBackground];
2) Vous pouvez définir la hauteur de l'en-tête et du pied de page 0.1
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return 0.1;
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return 0.1;
}
3) Vous pouvez ajouter une vue d'en-tête et de pied de page avec une hauteur de 0,1
tblCampaigns.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
tblCampaigns.tableFooterView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, tblCampaigns.bounds.size.width, 0.01f)];
Je me suis aussi cogné la tête contre celui-ci. Je suis presque sûr qu'il s'agit d'un bogue iOS7 . Ce qui m'a finalement aidé, c'est l'ordre des vues dans le fichier xib. J'avais une vue dans laquelle la vue table était affichée correctement et une autre dans laquelle la vue table avait cet espace supplémentaire de 35 pixels. La seule différence entre alors (UITableView wise), c’est que dans la vue mal affichée, UITableView était le premier enfant, alors que dans la vue qui s’affichait correctement, c’était le second.
Cela a fait l'affaire pour moi, changeant simplement l'ordre des points de vue. Je préfère vraiment ne pas ajouter de lignes de code supplémentaires pour une solution de contournement ...
Épinglez simplement votre table (ou faites-la commencer) au sommet absolu de la vue. L'espace indésirable supplémentaire correspond exactement à la hauteur d'une barre de navigation.
tableView.contentInsetAdjustmentBehavior = .never
était la solution pour moi (iOS12/xcode 10) sur une tableview simple avec en-têtes
Faire en-dessous (Swift) résout le problème, mais cela fonctionne lorsque vous n'avez pas besoin d'un en-tête.
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.min
}
Si vous le faites, vous devrez abandonner la toute première section et en utiliser une autre pour le contenu.
UITableViewDataSource
implémentation:
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return <number_of_data_sections>+1
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// the first section we don't use for data
if section == 0 {
return 0
}
// starting from 1, there are sections we use
if section == 1 {
let dataSection = section - 1
// use dataSection for your content (useful, when data provided by fetched result controller). For example:
if let sectionInfo = myFRC!.sections![dataSection] as? NSFetchedResultsSectionInfo {
return sectionInfo.numberOfObjects
}
}
return 0
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let dataIndexPath = NSIndexPath(forRow: indexPath.row, inSection: (indexPath.section - 1) )
// return cell using transformed dataIndexPath
}
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
if section == 1 {
// return your header height
}
return CGFloat.min
}
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
if section == 1 {
// return your header view
}
return nil
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
// in my case, even when 1st section header was of zero heigh, I saw the space, an that was a footer. I did not need footer at all, so always gave zero height
return CGFloat.min
}
Et c'est tout. Model ne sait rien du changement, car nous transformons le numéro de section lors de l'accès aux données.
Je viens de supprimer UITableView
de Interface Builder
, je l’ai créé à nouveau et une étrange 35px a disparu.
Il semble qu'il y ait un bogue étrange dans Interface Builder
.
si vous choisissez le style UITableViewStyleGrouped, vous devez implémenter la méthode de délégué Header
et Footer
height , et la valeur de retour doit être supérieure à 0. comme ça:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return CGFLOAT_MIN;
}
Lorsque vous devez masquer votre tableHeaderView, vous devez utiliser ce code Swift 3:
tableView.tableHeaderView = UIView(frame: CGRect(Origin: .zero, size: CGSize(width: 0.0, height: CGFloat.leastNormalMagnitude)))
Avec le storyboard:
Assurez-vous que votre contrainte supérieure UITableView ne dit pas "Sous le guide de disposition supérieur". Au lieu de cela, il devrait indiquer "Espace supérieur: Superview" (Superview.Top).
De plus, bien sûr, dans UIViewController qui contient UITableView, décochez la case "Ajuster les encarts de vue de défilement".
Code Swift 4: Pour une table sans en-tête de section, vous pouvez ajouter le code suivant:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNormalMagnitude
}
et vous obtiendrez l'espacement d'en-tête à 0.
Si vous voulez un en-tête de votre hauteur spécifique, transmettez cette valeur:
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return header_height
}
et la vue du délégué viewForHeaderinSection.
self.automaticallyAdjustsScrollViewInsets = NO;
C’était obsolète dans iOS 11, vous devriez donc utiliser la nouvelle propriété contentInsetAdjustmentBehavior
dans votre code, cela devrait régler le problème.
if #available(iOS 11.0, *) {
collectionView.contentInsetAdjustmentBehavior = .never
}
Une nouvelle propriété sur UIScrollView appelée contentInsetAdjustmentBehavior a été ajoutée dans iOS 11 pour déterminer le décalage de contenu.
J'ai un VC avec un conteneur dedans (qui d'ailleurs fait partie d'un contrôleur de navigation), et intégré à cela est une TableVC.
Sélectionner ma tableVC, en regardant le panneau d'attributs:
Ensuite, je règle l'auto-contrainte pour le conteneur par rapport à la vue parent comme suit:
Vue du conteneur.top = Marge ParentView.Top
Ceci accomplit ce qui suit pour moi:
Beaucoup d'essais et d'erreurs pour moi avec cette configuration, mais j'ai finalement trouvé ces petits détails postés par lekksi @ Supprimez les espaces vides avant les cellules dans UITableView
J'ai remarqué qu'il y a beaucoup de réponses à cette question en fonction de ce que vous essayez de faire. Je partage donc la mienne au cas où quelqu'un voudrait obtenir le même effet:
Dans mon contrôleur de vue, j'ai un groupe UITableView
dont le tableHeaderView
est composé d'un UIScrollView
de 200 points et d'un attribut UILabel
contenant le titre, le prix, l'emplacement et l'heure de l'annonce. En dessous se trouve le contenu de la vue tableau.
Avec les dimensions par défaut d'un en-tête de vue de tableau groupé, l'en-tête "MORE INFO" est trop loin sous le libellé "Il y a 5 jours". Je l'ai corrigé (déjà l'image ci-dessus) en remplaçant les hauteurs de l'en-tête et du pied de page de chaque section.
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return section == kMoreInfoSection ? 33 : UITableViewAutomaticDimension;
}
- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section
{
return UITableViewAutomaticDimension;
}
J'ai appris comment surmonter les altitudes du commentaire de @ erurainon dans la réponse acceptée et de UITableViewAutomaticDimension
à https://stackoverflow.com/a/14404104/855680 . Je n'avais pas à définir self.automaticallyAdjustsScrollViewInsets
sur NO
dans mon contrôleur de vue, contrairement à ce que suggère la réponse acceptée.
J'ai également déjà essayé de définir UIEdgeInsets
et de donner à la vue table une valeur négative pour le haut, mais cela n'a pas fonctionné - la vue entière de la table se déplace vers le haut, y compris tableHeaderView
.
Assurez-vous que vous avez donné des contraintes à la table. Je n'avais pas affronté le même problème d'avoir un rembourrage inexpliqué au bas de la table.
J'ai parcouru toutes les réponses. Aucun n'a fonctionné pour moi. Tout ce que je devais faire était:
self.myTableView.rowHeight = UITableViewAutomaticDimension
self.myTableView.estimatedRowHeight = 44.0
De plus, le problème ne se produisait pas en haut de tableView. Cela se passait au sommet de chaque section de la tableView.
FWIW, ce problème ne se produisait que pour iOS9. Notre application a bien fonctionné pour iOS10 et iOS 11.
Je vous recommande vivement de voir cette question géniale et ses principales réponses:
Dans mon cas, il y avait une cellule indésirable appelée "HeaderView" sur la visualisation de prototype dans Storyboard. Lorsque je l'ai supprimée, tout était bon.
si self.automaticallyAdjustsScrollViewInsets = NO;
ne fonctionne pas pour vous, assurez-vous que la hauteur de l'en-tête tableview ou de l'entête de section est CGFLOAT_MIN
et non 0
.
Par exemple, si vous souhaitez que tableview header 0 soit élevé, vous pouvez faire:
CGRect frame = self.tableViewHeader.frame;
frame.size.height = CGFLOAT_MIN; //not 0
self.tableView.tableHeaderView.frame = frame;
self.tableView.tableHeaderView = self.tableViewHeader;
J'espère que ça aide.
Swift3
If you are using grouped table then do following things .
This will remove top space.
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
self.tableView.tableHeaderView = UIView(frame: frame)
self.tableView.tableFooterView = UIView(frame: frame)
If you Still getting this issue then it will remove by default content offset from top.
[Set content insets never]
Enfin compris comment résoudre ce problème après avoir tout essayé!
J'ai remarqué que, pour une raison quelconque, le contentOffset de mon tableau avait un «y» de -20, donc lors de la configuration de mon tableau:
tableView.contentOffset = .zero
Objectif c
self.tableView.contentOffset = CGPointMake(0, 44);
Swift 4 répond ...
Si la vue tabulaire est sélectionnée dans le générateur d'interface et que le style "Groupé" est sélectionné dans l'inspecteur d'attributs, entrez le code suivant dans votre contrôleur de vue pour résoudre le problème d'espace d'en-tête supplémentaire.
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return CGFloat.leastNonzeroMagnitude
}
Utiliser Swift 4.1. Essaye ça:
func tableView(_ tableView: UITableView, viewForHeaderInSection
section: Int) -> UIView? {
return nil
}
sous iOS 7, l'affichage commence à l'écran plutôt que sous la barre de navigation. il est très simple de placer cela au bas de votre barre de navigation. Vérifiez CETTE réponse pour la solution, ce n'est pas la même question mais très liée à la vôtre.
Aucune des réponses ou des solutions de rechange ne m'a aidé. La plupart traitaient de la tableView elle-même. Ce qui me posait problème, c’était la vue sur laquelle j’ajoutais la tableView ou la collectionView. C'est ce qui l'a corrigé pour moi:
Swift 5
edgesForExtendedLayout = []
J'ai mis cela dans mon point de vue, DidLoad et le gênant écart est parti. J'espère que cela t'aides.
Encore une autre façon de le faire ... mais j'aime bien parce que cela évite de coder en dur toute valeur de hauteur .
Dans une table UITableViewStyleGrouped
(statique ou dynamique), affectez simplement la hauteur souhaitée dans tableView(_:heightForHeaderInSection)
. Je calcule la nouvelle hauteur en fonction du remplissage inférieur de l'étiquette d'en-tête de section.
override func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
var height = UITableViewAutomaticDimension
if section == 0, let header = tableView.headerViewForSection(section) {
if let label = header.textLabel {
// get padding below label
let bottomPadding = header.frame.height - label.frame.Origin.y - label.frame.height
// use it as top padding
height = label.frame.height + (2 * bottomPadding)
}
}
return height
}
Testé sur iOS 9, Xcode 7.3.
J'espère que ça aide.
Ce code a fonctionné pour moi. La meilleure réponse pour moi a été écrite en objective-C
à l'envers, je l'ai donc converti en Swift.
Pour Swift 4.0+
self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: 0.01))
Écrivez simplement ceci dans viewDidLoad()
et cela fonctionnera comme un champion.
Aucune des réponses précédentes n'a fonctionné pour moi. Qu'est-ce qui a bien fonctionné dans ma situation (voir ce bourrage après l'ajout dynamique d'un en-tête à mon Table View
) consistait à sélectionner le Navigation Bar
à partir du Document Outline
et à revérifier la case Translucent
(contrairement à certaines réponses disant . Je l'avais précédemment décochée parce que mon rouge semblait un peu orange, mais je ne pouvais pas essayer de réorganiser les éléments de la scène car le Table View
était le seul élément de cette scène. Cette solution fonctionne tant que vous êtes d'accord avec la couleur de Navigation Bar
recouverte d'un calque translucide. J'espère que cela t'aides :)
Pour moi, j'ai essayé toutes les solutions mais je pensais régler la hauteur pour la section UITableView et cela fonctionne pour moi. (Utilisation de Swift )
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.001
}
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 0.0
}
Cela a fonctionné pour moi. On peut aussi donner une hauteur pour l'en-tête en fonction de la section.