À partir d'iOS7, il y a de l'espace supplémentaire en haut de mon UITableView
qui a un style UITableViewStyleGrouped
.
Voici un exemple:
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
ios
uitableview
ios7
esilver
la source
la source
UITableView
n'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.self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.0f, CGFLOAT_MIN)];
note:0.0f
est 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).Réponses:
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.
la source
collectionview
. (Lorsque la table est à l'intérieurcollectionviewcell
)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 letableHeaderView
, au lieu de le faireself.tableView.tableHeaderView = nil;
, je fais:J'aime mieux cette solution que de définir un peu arbitraire
contentInset.top
parce que j'utilisecontentInset.top
aussi dynamiquement. Le fait de ne pas oublier d'enlever 35 pixels supplémentaires chaque fois que je recalculecontentInset.top
est fastidieux.la source
Debug > Color Misaligned Images
simulateur pour voir par vous-même.) Vous ne voulez pas faire ça.UITableViewHeaderFooterView
au lieu de UIView. EtCGFLOAT_MIN
fonctionne de la même manière0.01f
que mieux en théorie.Pour IOS 7, si vous allouez une vue de table dans un contrôleur de vue, vous pouvez examiner
votre problème semblait similaire au mien
Mise à jour:
Swift dans iOS 9.x:
Swift 3:
la source
UITableView
. Les problèmes proviennent du fait que j'étaisUITableView
sur unUIViewController
intérieurUINavigationController
qui a fait chuter le contenu de la table de 44 points, donc le contenu initial n'était pas derrièrenavBar
. Cela n'était pas nécessaire avec ma mise en page, donc cela a juste causé des problèmes. Finalement, j'ai changé mon codeautomaticallyAdjustsScrollViewInsets
qui fonctionnait aussi.edgesForExtendedLayout = []
Essayez de modifier la
contentInset
propriété quiUITableView
hérite deUIScrollView
.C'est une solution de contournement, mais cela fonctionne
la source
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.essayez, vous pouvez y faire face!
la source
uncheck Adjust scroll view insets
. Parce que parfois, nous n'utilisons pas le storyboard pour construire notre interface utilisateur.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)
Ce n'est peut-être pas une solution élégante mais ça marche pour moi
Version Swift:
la source
override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return section == 0 ? 14 : 24 }
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,
il y aura un espace supplémentaire de 35 px en haut. Si la ligne 27 est active et 24 est mise en commentaire,
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é.
la source
tableView:heightForHeaderInSection:
ettableView: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.Décochez "Ajuster les encarts de la vue de défilement"
la source
Un autre petit commentaire ... même dans XCode 6.1, il y a un bug avec des espaces verticaux apparaissant en haut de
UIScrollViews
,UITextViews
etUITableViews
.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.
(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.)
la source
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.
Ça fera l'affaire.
EDIT 1:
On pourrait aussi essayer -
Cela supprime également le rembourrage supplémentaire sur le dessus.
la source
Lors de l'utilisation de TableView groupée, utilisez-le pour éviter de couper les bordures dans viewWillAppear
la source
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:
a
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.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.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:
Quelque chose comme ça conduirait au problème à un moment donné (généralement, après un défilement):
la source
tableView.tableHeaderView
s'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.CGFLOAT_MIN
a été remplacé parCGFloat.leastNormalMagnitude
dans Swift 3Storyboard:
Décochez simplement:
Adjust Scroll View Insets
dans les options de View ControllerCode:
la source
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
.la source
Dans mon cas, c'est ce qui m'a aidé. Je soutiens également ios6.
la source
Ajoutez simplement ce qui suit à votre viewDidLoad dans votre VC:
la source
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
tableViewHeader
avec unUIView
avec au moins une0.01
hauteur a fonctionné.CGRectZero
n'a pas aidé, rien n'a vraiment aidé:la source
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é:
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.
la source
Merci à la réponse de @Aurelien Porte. Voici ma solution
Cause de ce problème: -
Dans ViewDidLoad: -
Pas besoin de quelque chose comme ça: -
Dans
heightForHeaderInSection
délégué: -En
viewForHeaderInSection
délégué: -la source
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
la source
automaticallyAdjustsScrollViewInsets
dans iOS 11Je suppose que cela fait partie du nouveau
UITableViewStyleGrouped
style. 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 toussubviews
lesUITableView
pour 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):
la source
UITableViewCellScrollView
) sur iOS7 nous a appris une chose, c'est de laisser la hiérarchie de vue des classes intégrées seules.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.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
framework définira automatiquement contentInset pré-calculé .
Pour éviter cela, vous pouvez faire
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
la source
self.automaticallyAdjustsScrollViewInsets = false
Ce code a fonctionné pour moi, la meilleure réponse pour moi qui a été écrite à l'envers
objective-C
alors je l'ai converti en Swift.Il suffit d'écrire ceci
viewDidLoad()
et cela fonctionnera comme un charme.la source
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.
la source
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.
la source
La seule chose qui a fonctionné pour moi était:
Rapide :
Objectif-C :
De plus, j'avais encore un espace supplémentaire pour la première section. C'est parce que j'utilisais
tableHeaderView
mal la propriété. Corrigé cela également en ajoutant:la source
Code Swift 4: Pour une vue de table sans en-têtes de section, vous pouvez ajouter ce code:
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:
et la vue du délégué viewForHeaderinSection.
la source
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.
la source
utiliser celui-ci je pense que cette aide ...
la source
la source