Pourquoi y a-t-il un rembourrage supplémentaire en haut de mon UITableView avec le style UITableViewStyleGrouped dans iOS7

637

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

Voici un exemple:

entrez la description de l'image ici

La vue de table commence à la première flèche, il y a 35 pixels de remplissage inexpliqué, puis l'en-tête vert est un UIView renvoyé par viewForHeaderInSection(où la section est 0).

Quelqu'un peut-il expliquer d'où vient cette quantité de 35 pixels et comment je peux m'en débarrasser sans passer à UITableViewStylePlain ?


Remarque:

Dans iOS 11 et versions ultérieures:

tableView.contentInsetAdjustmentBehavior = .never
esilver
la source
utilisez-vous le dernier iOS 7? Certains de ces TYPES d'incohérences (mais pas tous, et peut-être pas celui-ci) ont été corrigés dans les aperçus de développement ultérieurs. Je dois savoir: j'ai tergiversé tellement certains des problèmes ont disparu.
Dan Rosenstark
Vérifiez la réponse ici - stackoverflow.com/a/18986158/1463604
Nishant
La réponse courte est que ce remplissage supplémentaire est probablement dû à l'en-tête de vue de table (et non à l'en-tête de section), et qui UITableViewn'aime pas se voir attribuer un en-tête d'une hauteur de 0,0. Consultez stackoverflow.com/a/31223403/1394534 pour plus de détails.
Aurelien Porte
30
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];note: 0.0fest juste ignoré si vous l'utilisez à la hauteur du rect. Nous utilisons donc le CGFloat le plus proche de zéro possible (au moins, cela "fonctionnait" pour moi ... mais pas la solution idéale).
Alejandro Iván
1
@ AlejandroIván votre commentaire vient de faire ma nuit. J'ai une tableView avec des prototypes groupés. J'utilise numberSections = data.count et le paramètre numberRows = 1. J'ai défini un heightForFooterInSection pour faire un espace propre entre chacun et pour une raison quelconque, un tableHeaderView vide est apparu.
Ryan Alexander

Réponses:

863

J'ai été aidé par les éléments suivants:

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

entrez la description de l'image ici

Alexandre
la source
42
Je pense que c'est la bonne façon de supprimer ce rembourrage, au lieu de falsifier les valeurs edgeInset.
Hgeg
21
Cela n'a pas fonctionné pour moi - j'ai un navBar opaque au-dessus et cela éteint pousse le contenu en dessous.
slycrel
5
Ne fonctionne pas lors de l'utilisation de la personnalisation collectionview. (Lorsque la table est à l'intérieur collectionviewcell)
Akshit Zaveri
5
N'a pas fonctionné pour moi; La seule chose qui a fonctionné était de passer à Plain au lieu de Grouped
shim
28
J'ai eu ce problème avec un TableViewController dans une vue de conteneur. J'ai dû définir cette propriété non pas directement sur le TableViewController qui était incorporé, mais sur le contrôleur de vue qui contenait la vue du conteneur. Ensuite, cela a fonctionné.
Andy Mortimer
326

J'ai joué un peu plus avec et il semble que ce soit un effet secondaire de la configuration des tablesView tableHeaderView = nil.

Parce que ma tableView a une apparence dynamique tableHeaderView, quand j'ai besoin de cacher le tableHeaderView, au lieu de le faire 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 peu arbitraire contentInset.topparce que j'utilise contentInset.topaussi dynamiquement. Le fait de ne pas oublier d'enlever 35 pixels supplémentaires chaque fois que je recalcule contentInset.topest fastidieux.

Mr. T
la source
4
Excellente solution! En effet, vous devez le définir sur 0.01f pour vous débarrasser de la vue d'en-tête de la vue de table par défaut comme dans votre code.
Simone Manganelli
2
BTW, cela est également possible de faire avec un glisser-déposer dans le générateur d'interface. Quoi qu'il en soit, merci! :)
Rudolf Adamkovič
8
vous monsieur mérite une médaille pour cela
Vaibhav Gautam
7
Gardez à l'esprit qu'une vue de hauteur 0,01f en haut de votre vue de table signifie que toutes les cellules beaneath sont désalignées (la première cellule ayant une origine Y de 0,01, la suivante de cell_height + 0,01, etc.) donc le contenu de ces cellules sera mal aligné. (Allumez le Debug > Color Misaligned Imagessimulateur pour voir par vous-même.) Vous ne voulez pas faire ça.
Simon Whitaker
2
Il vaut mieux utiliser UITableViewHeaderFooterViewau lieu de UIView. Et CGFLOAT_MINfonctionne de la même manière 0.01fque mieux en théorie.
Jaybo
178

Pour IOS 7, si vous allouez une vue de table dans un contrôleur de vue, vous pouvez examiner

self.edgesForExtendedLayout = UIRectEdgeNone;

votre problème semblait similaire au mien

Mise à jour:

Swift dans iOS 9.x:

self.edgesForExtendedLayout = UIRectEdge.None

Swift 3:

self.edgesForExtendedLayout = UIRectEdge.init(rawValue: 0)
ouaisdixon
la source
3
A travaillé dans ma plaine UITableView. Les problèmes proviennent du fait que j'étais UITableViewsur un UIViewControllerintérieur UINavigationControllerqui a fait chuter le contenu de la table de 44 points, donc le contenu initial n'était pas derrière navBar. Cela n'était pas nécessaire avec ma mise en page, donc cela a juste causé des problèmes. Finalement, j'ai changé mon code automaticallyAdjustsScrollViewInsetsqui fonctionnait aussi.
DBD
Cette propriété est appliquée uniquement pour afficher les contrôleurs qui sont incorporés dans un conteneur tel que UINavigationController. Le contrôleur de vue racine de la fenêtre ne réagit pas à cette propriété. La valeur par défaut de cette propriété est all. ..Je pense que la valeur par défaut devrait être 0? Où cela a-t-il un avantage.
Desh_
5
Plus élégant avec Swift 3:edgesForExtendedLayout = []
Dave Batton
Bonjour @yeahdixon Quel logiciel utilisez-vous pour créer la flèche rose? merci d'avance
iArezki
175

Essayez de modifier la contentInsetpropriété qui UITableViewhérite de UIScrollView.

self.tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);

C'est une solution de contournement, mais cela fonctionne

nvrtd frst
la source
6
contentTableView.contentInset = UIEdgeInsetsMake(-20, 0, -20, 0);a fonctionné le mieux pour moi car il y avait 20 pixels supplémentaires en haut et en bas.
Brian
1
Bien que cette solution de "force brute" fonctionne, je pense que celles du bas (en particulier les encarts à ajustement automatique) devraient être classées plus haut.
eladleb
134
self.automaticallyAdjustsScrollViewInsets = NO;

essayez, vous pouvez y faire face!

guanhuiwit
la source
Cela fonctionne très bien pour masquer le tableHeaderView dans iOS 7.0, mais il n'est pas pris en charge dans les anciennes versions.
Brian
Fonctionne très bien sous iOS 7.
StackRunner
3
Important: assurez-vous de le faire dans le contrôleur de vue de conteneur, si votre UITableView est placé sur un contrôleur qui est ensuite intégré dans un autre contrôleur, faites-le dans le contrôleur supérieur d'intégration, pas directement celui où vous placez UITableView (où AutoLayout sera prendre soin des choses).
James Stone
C'est mieux que ça uncheck Adjust scroll view insets. Parce que parfois, nous n'utilisons pas le storyboard pour construire notre interface utilisateur.
JW.ZG
Cela fonctionne pour moi. J'ai attaché la vue à la barre de navigation et à la table, cela ne se produit pas dans iOS 11, mais cela se produit dans iOS 10. Merci.
dobiho
78

Vous pouvez détecter si votre application exécute iOS7 ou une version ultérieure et ajouter ces deux méthodes dans votre délégué de vue de 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 ça marche 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
}
Homme léger
la source
1
Cela a fonctionné pour moi. UITableView ajoute de l'espace sur le dessus pour de nombreuses raisons différentes. Plus précisément, lié à OP, le problème ne se produit que pour la vue de table de style groupée. Et cette solution a résolu le problème.
RajV
5
Vous pouvez utiliser CGFLOAT_MIN au lieu de 0,001, cela vous donne la plus petite valeur absolue de CGFloat.
eiKatte
2
Ceci est la bonne réponse, car la fonctionnalité réelle est que le remplissage n'est présent que dans la vue de table de style groupée et est ignoré si vous spécifiez l'en-tête / pied de page
Jakub Truhlář
Cela devrait être marqué comme la bonne réponse. Une méthode déléguée à remplacer et elle répond à la question. Essayez au moins cela en premier si vous lisez aussi loin tous les hacks. Essayez de tweeter: - (CGFloat) tableView: (UITableView *) tableView heightForHeaderInSection: (NSInteger) section {// return CGFLOAT_MIN; return 30.0f; }
Matthew Ferguson
Agréable! En prime, si vous voulez un petit en-tête au-dessus et plus entre les sections groupées, vous pouvez utiliser ce qui suit:override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
Freek Sanders
55

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 d'iOS7, si vous créez un UITableView avec le style Groupé, mais que vous n'avez pas de délégué défini sur la première mise en page, vous définissez un délégué et appelez reloadData, il y aura un espace de 35 pixels en haut qui ne disparaîtra jamais.

Voir ce projet que j'ai fait 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 24 est mise en commentaire,

self.tableView.delegate = self;

pas d'espace en haut. C'est comme si la tableView met en cache un résultat quelque part et ne se redessine pas une fois que le délégué est défini et que reloadData est appelé.

esilver
la source
21
J'ajouterais que même s'il y a un délégué mais le délégué tableView:heightForHeaderInSection:et tableView:heightForFooterInSection:renvoie 0, vous aurez également ce problème. L'implémentation des méthodes de protocole ci-dessus ET le retour de 0,01f l'ont corrigé pour moi.
John Estropia
1
OUI!! J'ai essayé 3 soi-disant solutions, et c'était celle-là! Brillant, merci: D
Henrik Erlandsson
parfait. Tout le monde a signalé un bogue car je pense que ce n'est pas le comportement souhaité.
Pushparaj
bonne trouvaille! Cela se produit toujours dans ios 9 (nous n'utilisons pas de XIB), mais la définition du délégué sur init a fixé l'espacement (pas dans loadView ou viewDIdLoad). Je vous remercie!
John Stricker
1
Réglage de la
Viktor
49

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

entrez la description de l'image ici

Tú Đt
la source
J'avais besoin de cette option pour un autre View Controller à moi, et apparemment, quand j'ai fait un nouveau VC, le changement a été reporté. Merci pour cela!
David
Ouais! Fonctionne, il suffit de le définir dans ContainerView et fonctionne!
Felipe FMMobile
46

Un autre petit commentaire ... même dans XCode 6.1, il y a un bug avec des espaces verticaux apparaissant en haut de UIScrollViews, UITextViewset UITableViews.

entrez la description de l'image ici

Parfois, la seule façon de résoudre ce problème est d'aller dans le Storyboard et de faire glisser le contrôle du problème afin qu'il ne soit plus la première sous- vue de la page.

entrez la description de l'image ici

(Mes remerciements à Oded pour m'avoir dirigé dans cette direction ... Je poste ce commentaire, juste pour ajouter quelques captures d'écran, pour démontrer les symptômes et corriger.)

Mike Gledhill
la source
1
Notez que ce problème, errrr, se produit également dans iOS 8 si vous avez un UITextView comme premier sous-contrôle sur votre page ... il ne s'agit donc pas uniquement d'un problème UITableView.
Mike Gledhill
1
De toute solution, seul ce hack a fonctionné pour moi. Une correction bizarre à un bug bizarre. J'ai rencontré ce problème avec UITableview.
Mesbah
4
1 million de remerciements! C'est la seule solution qui a fonctionné pour moi.
user139816
1
(Je suis étonné de ses 18 mois plus tard, et les lecteurs votent toujours pour cette réponse. Apple n'a-t-il vraiment pas encore résolu ce problème?!)
Mike Gledhill
1
sauvé ma vie! Merci. savez-vous combien de temps il a fallu pour trouver ce simple petit "correctif"? grrh.
Mc.Stever
40

Selon ce guide de transition pour iOS7 par Apple, les insertions de contenu de la vue de défilement sont automatiquement ajustées. La valeur par défaut de automaticallyAdjustsScrollViewInsets est définie sur YES.

Le UIViewController qui a le UITableView doit définir cette propriété sur NO.

self.automaticallyAdjustsScrollViewInsets = NO;

Ça fera l'affaire.

EDIT 1:

On pourrait aussi essayer -

self.navigationController.navigationBar.translucent = YES;

Cela supprime également le rembourrage supplémentaire sur le dessus.

girish_vr
la source
Très bonne réponse, à moins qu'elle ne réponde pas exactement à la question. Esilver parle d'un écart de 35 pixels, mais iOS7 ajoute un en-tête supplémentaire de 20 pixels: égal à la hauteur de la barre d'état.
Martin
Problème ridicule. Merci d'avoir répondu.
Genki
Ceci est la réponse à un problème différent.
entonio
Merci, cela a fonctionné pour moi, dans mon cas particulier, j'avais un tableviewcontroller intégré dans le viewcontroller, et en définissant automatiquementAdjustsScrollViewInsets = false dans le viewcontroller, l'écart supérieur a disparu
Alexey
39

Lors de l'utilisation de TableView groupée, utilisez-le pour éviter de couper les bordures dans viewWillAppear

self.tableView.contentInset = UIEdgeInsetsMake(-35, 0, 0, 0);
Aqib Mumtaz
la source
J'ai essayé tous les autres. C'est celui qui a fonctionné! Thx
Michael
36

Beaucoup de réponses précédentes sont trop hacky. Ils se briseraient à tout moment dans le futur si Apple décidait de corriger ce comportement inattendu.

Racine du problème:

  1. a UITableViewn'aime pas avoir un en-tête d'une hauteur de 0,0. Si ce que vous essayez de faire est d'avoir un en-tête d'une hauteur de 0, vous pouvez passer à la solution.

  2. même si plus tard vous attribuez une hauteur non 0,0 à votre en-tête, un UITableViewn'aime pas se voir attribuer un en-tête d'une hauteur de 0,0 au début.

Solution:

Ensuite, la solution la plus simple et la plus fiable consiste à vous assurer que la hauteur de votre en-tête n'est pas 0 lorsque vous l'affectez à votre vue de table.

Quelque chose comme ça fonctionnerait:

// 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 ça conduirait au problème à un moment donné (généralement, après un défilement):

// Replace UIView with whatever class you're using as your header below:
UIView *tableViewHeaderView = [[UIView alloc] initWithFrame:CGRectZero];
self.tableView.tableHeaderView = tableViewHeaderView;
Aurelien Porte
la source
Enfin, j'ai trouvé la réponse qui fonctionne. Merci. En outre, j'ai appris qu'il tableView.tableHeaderViews'agit en fait d'une vue accessoire au-dessus du contenu des lignes. J'ai été confondu avec les en-têtes de section jusqu'à ce que votre réponse soit publiée.
Joe Huang
1
CGFLOAT_MINa été remplacé par CGFloat.leastNormalMagnitudedans Swift 3
Clay Ellis le
29

Storyboard:

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

entrez la description de l'image ici

Code:

self.automaticallyAdjustsScrollViewInsets = false
Bartłomiej Semańczyk
la source
2
en utilisant xcode 7 je ne vois pas Inspecteur d'attributs> Disposition, où dois-je ajouter self.automaticallyAdjustsScrollViewInsets = false
alex
en vue ne charge.
CW0007007
23

Voici la solution pour iOS 10 utilisant Swift 3:

Vous pouvez vous débarrasser des rembourrages supérieur et inférieur en implémentant les méthodes suivantes à partir du UITableViewDelegate.

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat
{ 
    return CGFloat.leastNormalMagnitude
}

func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat
{
   return CGFloat.leastNormalMagnitude
}
AndreasLukas
la source
La deuxième page sur SO m'a aidé .... Je ne sais pas pourquoi, peut-être à cause de la dimension automatique, peut-être à cause des contraintes avec le VFL, de toute façon, merci! ozi bua ist brav! : D
Pentarex
Ce sont les en - têtes et pieds de page des sections . La question concerne l'en-tête de la table entière. De plus, il n'y a rien de spécifique à Swift3 ou iOS 10 dans l'une ou l'autre méthode déléguée (ils existent depuis toujours).
Nicolas Miari
14

Dans mon cas, c'est ce qui m'a aidé. Je soutiens également ios6.

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.extendedLayoutIncludesOpaqueBars = NO;
    self.automaticallyAdjustsScrollViewInsets = NO;
}
Lukas
la source
Je ne sais pas ce que cela fait, mais cela a fonctionné parfaitement. Pourriez-vous donner quelques explications?
Matt Wolfe
@MattWolfe J'étais perdu et j'ai trouvé cette solution, je ne sais pas non plus pourquoi cela se produit. Je suppose que le contrôleur décide que tableview a besoin d'un encart, en raison de la barre d'état (ou dans d'autres cas, barre d'outils / tabulation), il l'ajoute donc automatiquement. Je me bats vraiment avec certaines des nouvelles "fonctionnalités" iOS7. Peut-être que quelqu'un le comprend et a une vraie explication à ce sujet?
Lukas
J'ai passé les 2 derniers jours à porter une application relativement petite sur iOS 7 et à avoir encore des problèmes mineurs .. Je la corrige dans ios 7, elle se brise en 6 et vice versa .. Me rend dingue!
Matt Wolfe
Il s'agit d'un problème différent de celui de l'OP. Même avec cela, pour la vue de table groupée, un espace supplémentaire est ajouté sur le dessus.
RajV
1
cela semble être la ligne clé: self.automaticallyAdjustsScrollViewInsets = NO; juste le réglage qui a supprimé l'espace supplémentaire que j'avais.
Mike M
14

Ajoutez simplement ce qui suit à votre viewDidLoad dans votre VC:

self.automaticallyAdjustsScrollViewInsets = NO;
judepereira
la source
Ce correctif a fonctionné et je le préfère au réglage manuel des encarts à l'aide de nombres magiques. Merci!
imobilizer
14

J'essayais donc toutes les méthodes ici, et cette fois aucune n'a aidé. Mon cas était une vue groupée sous iOS 9. Je ne sais pas vraiment pourquoi et comment j'ai découvert celui-ci, mais pour moi, régler le tableViewHeaderavec un UIViewavec au moins une 0.01hauteur a fonctionné. CGRectZeron'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))
sunshinejr
la source
10

Swift: iOS J'ai eu tableview sur la vue de défilement .. quand je cliquais sur "Retour" sur le même écran. La vue de défilement prend plus d'espace sur le dessus .. pour résoudre ce problème, j'ai utilisé:

 self.automaticallyAdjustsScrollViewInsets = false

Valeur booléenne qui indique si le contrôleur de vue doit ajuster automatiquement ses encarts de vue de défilement. La valeur par défaut est true, ce qui permet au contrôleur de vue d'ajuster ses encarts de vue de défilement en réponse aux zones d'écran consommées par la barre d'état, la barre de navigation et la barre d'outils ou la barre d'onglets. Définissez-le sur false si vous souhaitez gérer vous-même les ajustements de l'encart de la vue de défilement, par exemple lorsqu'il existe plusieurs vues de défilement dans la hiérarchie des vues.

Vinod Joshi
la source
10

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

Cause de ce problème: -

  1. un UITableView n'aime pas avoir un en-tête d'une hauteur de 0,0. Si ce que vous essayez de faire est d'avoir un en-tête d'une hauteur de 0, vous pouvez passer à la solution.
  2. même si plus tard vous attribuez une hauteur non 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)

Dans heightForHeaderInSection délégué: -

if section == 0
    {
        return 1
    }
    else
    {
        return 40; // your other headers height value
    }

En viewForHeaderInSectiondé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 
}
Ashish Pisey
la source
10

Voilà comment il peut être corrigé facilement dans iOS 11 et Xcode 9.1 via Storyboard:

Sélectionnez Affichage tableau> Inspecteur de taille> Encarts de contenu: jamais

Saeed Ir
la source
1
A travaillé pour moi :)
bhupinder
Génial! Merci :)
Saeed Ir
1
C'est au lieu de automaticallyAdjustsScrollViewInsetsdans iOS 11
Nik Kov
9

Je suppose que cela fait partie du nouveau UITableViewStyleGroupedstyle. Il se trouve 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 un UIView, il serait possible de parcourir tous subviewsles UITableViewpour 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émarrage des en-têtes et des cellules et qu'il n'y ait aucun moyen de le modifier.

Pour rechercher dans toutes les sous-vues (je voudrais exécuter ce code lorsque le tableau n'a pas de cellules, pour faciliter la lecture de la sortie):

- (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];
    }
}
Kevin
la source
3
Si UITableViews (pour être plus précis UITableViewCellScrollView) sur iOS7 nous a appris une chose, c'est de laisser la hiérarchie de vue des classes intégrées seules.
Matthias Bauch le
Bon point. L'autre option est ... de continuer à pirater pour chaque iOS;)
Dan Rosenstark
Oups, ouais. Destiné à écrire cet avertissement mais oublié.
Kevin
Kevin - Je pense que vous avez raison, c'est par conception. Il semble que renvoyer 0 pour heightForHeaderInSection est le moyen le plus simple de supprimer ce remplissage. Pour une raison quelconque sur cette instance particulière, cela ne fonctionnait pas pour moi, mais cela fonctionne sur d'autres UITableViews.
esilver
1
C'est définitivement "par conception". Si vous avez suspendu l'exécution et exécuté: po [((UIApplication *)UIApplication.sharedApplication).keyWindow recursiveDescription]vous verrez que l'en-tête du tableau, ou l'en-tête de la première section, ou la première cellule (selon ce que vous utilisez) laisse naturellement une bordure de 35 pixels .... boo.
M. T
9

Ma réponse va être une réponse plus générale, mais peut également être appliquée à ce sujet.

Si la vue racine (du ViewController ) ou le premier enfant (sous-vue) de la vue racine est une sous-classe de UIScrollView (ou UIScrollView lui-même), et si

self.navigationController.navigationBar.translucent = YES;

framework définira automatiquement contentInset pré-calculé .


Pour éviter cela, vous pouvez faire

self.automaticallyAdjustsScrollViewInsets = NO;

mais dans mon cas, je n'ai pas pu le faire, car j'implémentais un SDK qui a 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 de UIViewController, des insertions automatiques seront appliquées par le système.

J'ai corrigé cela en ajoutant une vue factice avec le cadre (0,0,0,0) avant d'ajouter UIWebView.

Dans ce cas, le système n'a pas trouvé la sous-classe de UIScrollView comme première sous-vue et n'a pas appliqué d'encarts

zvjerka24
la source
sauvetage! merciself.automaticallyAdjustsScrollViewInsets = false
ethanneff
8

Ce code a fonctionné pour moi, la meilleure réponse pour moi qui a été écrite à l'envers objective-Calors je l'ai 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))

Il suffit d'écrire ceci viewDidLoad()et cela fonctionnera comme un charme.

Vipul Kumar
la source
1
merci beaucoup, a bien fonctionné pour moi.
Ângelo Polotto
1
votre code de bienvenue heureux
Vipul Kumar
7

J'ai eu le même correctif que arielyz. Une fois que j'ai déplacé UITableView pour qu'il ne soit pas la première sous-vue de la vue parent, il a disparu. Mon espace était de 20 px, pas 35.

Je n'ai pas pu le recréer dans un portrait xib, seulement un paysage xib. Je déposerai un bug radar plus tard si je peux le reproduire dans une simple application de démonstration.

Oded
la source
Ran dans le même problème, n'a pas été en mesure de le résoudre en changeant le contentInset mais cette méthode a fonctionné, même si elle est assez hacky. Pour ce que ça vaut, en utilisant l'outil de débogage visuel, j'ai pu voir que même si l'UITableView avait la bonne hauteur, l'UITableViewWrapper à l'intérieur n'en avait pas.
Mic Fok
Parfait. Cela a corrigé le bogue pour moi, dans XCode 6.1. Aucune des autres suggestions de cette page StackOverflow n'a fait de différence. J'avais une UITableView dans une UIView, et c'était la première sous-vue. Le faire glisser pour devenir la deuxième sous-vue le réparait parfaitement. (Si quelqu'un a besoin de moi, je serai au pub.)
Mike Gledhill
Je vous remercie! Cela fonctionne également si vous avez un contrôleur de vue de table dans un conteneur. Déplacer le conteneur de sorte qu'il ne soit pas le premier dans la vue du parent supprime l'espace en haut de la vue de table.
strangeluck
7

Je pense que rendre 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 en 0.1f, le problème a disparu.

Jiangfan Du
la source
1
Si je le pouvais, je voterais plus d'une fois. Ça doit être un problème de mise en page automatique bizarre ou quelque chose comme ça ... Comme tout ce qui fonctionne> 0, je suggère au lieu de 0,1 d'utiliser FLT_EPSILON ou DBL_EPSILON, car les deux représentent la plus petite valeur positive telle que 1.0 + epsilon! = 1.0
Henri Normak
7

La seule chose qui a fonctionné pour moi était:

Rapide :

tableView.sectionHeaderHeight = 0
tableView.sectionFooterHeight = 0

Objectif-C :

self.tableView.sectionHeaderHeight = 0;
self.tableView.sectionFooterHeight = 0;

De plus, j'avais encore un espace supplémentaire pour la première section. C'est parce que j'utilisais tableHeaderViewmal la propriété. Corrigé cela également en ajoutant:

self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.frame.size.width, height: 0.01))
Danut Pralea
la source
Fonctionne pour moi pour Swift 4.2. Merci
Sylar
J'ai tout essayé dans cette page, pour une vue de table groupée iOS13 avec une vue d'en-tête. self.tableView.tableHeaderView = UIView (cadre: CGRect (x: 0, y: 0, largeur: tableView.frame.size.width, hauteur: 0,01)). résolu le problème.
Ning
7

Code Swift 4: Pour une vue de table sans en-têtes de section, vous pouvez ajouter ce code:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return CGFloat.leastNormalMagnitude
}

et vous obtiendrez l'espacement d'en-tête à 0.

Si vous voulez qu'un en-tête de votre hauteur spécifique dépasse cette valeur:

func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
    return header_height
}

et la vue du délégué viewForHeaderinSection.

keerthana manoharan
la source
Cela ne répond pas à la question. La question était de savoir d'où venait l'espacement supplémentaire, pas comment s'en débarrasser.
Stephen Newell
chose étrange est que si u retourne 0 dans heightForHeaderInsection u obtient toujours cet espace supplémentaire. Cela fonctionne parfaitement avec CGFloat.leastNormalMagnitude (nombre le moins positif)
ShadeToD
7

Pour être précis, pour supprimer l'espace tableviewHeader du haut, j'ai apporté ces modifications:

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

entrez la description de l'image ici

user832
la source
Quelles sont les informations supplémentaires autres que la capture d'écran par rapport à cette réponse ?
Artjom B.
c'est la même chose je suppose, je n'ai pas trouvé cette réponse quand je cherchais une solution. Dois-je supprimer ma réponse alors ..?
user832
Pas si vous pouvez développer un peu votre réponse en décrivant pourquoi les insertions de contenu = ne résout jamais réellement ce problème (comment fonctionne cette option?).
Artjom B.
Lorsque les insertions de contenu sont définies sur jamais, la tableView ne défilera pas vers le haut lors de la modification de textField.
mojtaba al moussawi
6

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...
 }
Shahzaib Maqbool
la source
1
Brillant! Fonctionne comme un charme dans iOS 9.2. Cette réponse est parfaite car dans certains cas, je dois supprimer le premier en-tête tandis que dans d'autres, l'afficher. J'ai vu une autre réponse en utilisant CGFloat.min, qui fonctionne aussi. Donc, mon viewController peut désormais fournir un nombre réel tel que 44,0 ou essentiellement 0.
David H
6
override func viewWillAppear(animated: Bool) {
        self.edgesForExtendedLayout = UIRectEdge.None

 //  OR

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

   //OR

 self.automaticallyAdjustsScrollViewInsets = false
        }
AG
la source
automaticallyAdjustsScrollViewInsets = faux travail de ma part! THX!
Daniel Kuta