web-dev-qa-db-fra.com

Pourquoi y a-t-il un remplissage supplémentaire au sommet de mon UITableView avec le style UITableViewStyleGrouped dans iOS7

À partir de iOS7, il y a de l'espace supplémentaire en haut de mes UITableView qui ont un style UITableViewStyleGrouped

Voici un exemple:

enter image description here

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

587
esilver

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é. 

52
esilver

J'ai été aidé par ce qui suit:

YouStoryboard.storyboard> YouViewController> Inspecteur d'attributs> Décocher - Ajuster les encarts de la vue de défilement.

 enter image description here

852
Alexander

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

296
Mr. T

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)
174
yeahdixon

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

159
nvrtd frst
self.automaticallyAdjustsScrollViewInsets = NO;

essayez, vous pouvez y faire face!

132
guanhuiwit

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
}
66
LightMan

Décochez "Ajuster les incrustations de la vue de défilement"

 enter image description here

49
Tú Đt

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.

enter image description here

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.

enter image description here

(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.)

45
Mike Gledhill

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. 

39
girish_vr

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);
37
Aqib Mumtaz

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:

  1. 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.

  2. 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;
33
Aurelien Porte

Storyboard:

Décochez simplement: Adjust Scroll View Insets dans les options de View Controller

enter image description here

Code:

self.automaticallyAdjustsScrollViewInsets = false
29

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
}
18
AndreasLukas

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;
}
14
Lukas

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))
14
sunshinejr

Ajoutez simplement les éléments suivants à votre viewDidLoad dans votre VC:

self.automaticallyAdjustsScrollViewInsets = NO;
14
judepereira

Merci à la réponse de @Aurelien Porte. Voici ma solution

Cause de ce problème: - 

  1. 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.
  2. même si, ultérieurement, vous assignez une hauteur différente de 0.0 à votre en-tête, un UITableView n'aime pas se voir attribuer un en-tête d'une hauteur de 0.0 au début.

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 
}
10
Ashish Pisey

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.

10
Vinod Joshi

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.

9
zvjerka24

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];
    }
}
8
Kevin

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 

8
Pink Panther

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.

7
Jiangfan Du

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.

7
Oded
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

self.sampleTableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
6
A.G

Pour être plus précis, supprimer l’espace tableviewHeader en haut de la page a apporté les modifications suivantes:

YouStoryboard.storyboard> YouViewController> Sélectionner TableView> Inspecteur de taille> Encarts de contenu - Définissez-le sur jamais.

 enter image description here

6
user832

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))
6
Danut Pralea

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...
 }
6
Shahzaib Maqbool
-(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)];
5
Hari c

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 ...

4
arielyz

É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.

4
latenitecoder
tableView.contentInsetAdjustmentBehavior = .never

était la solution pour moi (iOS12/xcode 10) sur une tableview simple avec en-têtes

3
david

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.

3
Yevhen Dubinin

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.

3
LorikMalorik

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;
}
3
FFur

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".

2
konsti

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.

2
keerthana manoharan

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.

2
Aks

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:

  • décocher ajuster automatiquement les encarts de défilement
  • décocher les bords étendus sous la barre supérieure

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:

  • garde la table tirée vers le haut, mais juste sous ma barre de navigation
  • après rafraîchissement, la table revient à cette position et non + sous la barre de navigation comme il le faisait
  • après avoir fait défiler le fond de la table vers le bas, pas avant

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

2
the_dude_abides

Je ne suis pas sûr si cette bonne réponse mais ça fonctionne avec moi

Je sélectionne la vue Tableau, navigue jusqu'à la règle, change la valeur de Y pour qu'elle soit zéro 

 enter image description here

1
Mina Fawzy

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:

enter image description here

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.

1
Matthew Quiros

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.

1
Yash Tamakuwala

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: 

Utilisation de la disposition automatique dans UITableView pour des dispositions de cellules dynamiques et des hauteurs de rangées variables

1
Honey

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.

1
Robert Juz

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.

0
coolbeet

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]          

https://i.stack.imgur.com/fjxOV.png

0
Narendra Prajapati

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);
0
Jason Silver

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
}
0
F. Morales

Utiliser Swift 4.1. Essaye ça: 

func tableView(_ tableView: UITableView, viewForHeaderInSection 
section: Int) -> UIView? {
    return nil 
}
0
ali ziwa

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.

0
MQoder

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.

0
c0d3p03t

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.

0
maganap

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.

0
Vipul Kumar

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 :)

0
jeff t

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
    }
0
Mr.Javed Multani
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.

0
vsujan