Supprimer l'espace vide avant les cellules dans UITableView


172

J'essaie actuellement de mettre un UITableViewdans un emplacement différent plutôt qu'en haut de mon contrôleur de vue. Cela dit, il essaie d'ajouter l'en-tête en haut pour tenir compte de la barre de navigation, mais ce n'est pas nécessaire car je n'ai pas en haut de mon contrôleur.

Si je mets le coin supérieur gauche de l' UITableViewendroit où je veux que les cellules soient, cela ne place pas les cellules là:

Maintenant, si je déplace simplement la vue du tableau vers le haut pour que les cellules soient au bon endroit, j'obtiens un problème différent - les cellules peuvent être déplacées vers le haut lors du défilement (c'est avec mon doigt au-dessus du contrôleur de navigation):

Quand je lâche prise, oui - les cellules iront juste en dessous de la barre de recherche, mais c'est évidemment un problème comment vous pouvez les amener au-dessus.

Comment pourrais-je procéder? Y a-t-il un moyen plus simple?

Réponses:


378

Est-ce que les cellules du UITableViewspectacle sur l'espace vide lorsque vous faites défiler vers le bas?

Si tel est le cas, le problème peut provenir de l’encart ajouté au UITableViewcontrôleur de navigation que vous avez dans votre vue. L'encart est ajouté à la vue de tableau afin que le contenu soit placé sous la barre de navigation lorsqu'aucun défilement n'a eu lieu. Lorsque le tableau fait défiler, le contenu défile et s'affiche sous une barre de navigation transparente. Ce comportement n'est bien entendu souhaité que si la vue tableau démarre directement sous la barre de navigation, ce qui n'est pas le cas ici.

Une autre chose à noter est qu'iOS ajuste l'encart de contenu uniquement pour la première vue dans la hiérarchie de vues si elle est UIScrollViewou si elle est descendante (par exemple UITableViewet UICollectionView). Si votre hiérarchie de vues comprend plusieurs vues de défilement, automaticallyAdjustsScrollViewInsetsapportera des ajustements uniquement au premier.

Voici comment modifier ce comportement:

a) Générateur d'interface

  • Sélectionnez le contrôleur de vue
  • Ouvrir l'inspecteur d'attributs
  • Il existe une propriété appelée «Ajuster les inserts de vue de défilement» dans l'inspecteur d'attributs d'IB (lorsqu'un contrôleur de vue est sélectionné) qui est activée par défaut. Décochez cette option:


    (Image gracieuseté de Dheeraj D )

Je ne sais pas quelle version de Xcode a introduit cette option (je ne l'ai pas repérée dans les notes de publication), mais elle est au moins disponible dans la version 5.1.1.

Edit: Pour éviter toute confusion, c'était la troisième option mentionnée dans les commentaires

b) Par programme

Ajouter ceci à ie viewDidLoad(crédits à la réponse de Slavco Petkovski et au commentaire de Cris R )

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Cela pourrait être pertinent pour les anciens élèves

Vous pouvez soit résoudre ce problème en ajoutant

tableView.contentInset = UIEdgeInsetsZero

//Swift 3 Change
tableView.contentInset = UIEdgeInsets.zero

Ou si vous utilisez IB et si la barre de navigation n'est pas transparente (ne peut pas le dire sur la capture d'écran)

  • Sélectionnez le contrôleur de vue
  • Ouvrir l'inspecteur d'attributs
  • Dans les options du contrôleur de vue, section Prolonger les bords, désélectionnez «Sous les barres supérieures»

2
Désélectionner "Under Top Bars" sur l'UIView a très bien fonctionné pour moi. Merci.
Andreas Øverland

Je devenais fou en utilisant "Paging Enabled" et le défilement ne se déplaçant que par la hauteur de la barre de navigation au lieu de la cellule entière. Merci.
LordParsley

8
La troisième option: désélectionner "Ajuster les incrustations de vue de défilement" - a fonctionné comme un charme. merci lekksi!
Stas Zhukovskiy

2
self.automaticallyAdjustsScrollViewInsets = false dans Swift travaillant "de pelos"!
Cris R

1
Merci de définir UIEdgeInsetsZero est nécessaire si vous réutilisez une table dans un nouveau contrôleur de table à chaque fois qu'il est affiché, sinon le même espace blanc apparaît et devient de plus en plus grand.
malhal

71

J'ai eu le même problème et je suis presque sûr que j'avais un UIView là-dedans à un moment donné. Le simple fait de copier la vue du tableau entier, de le supprimer et de le coller à nouveau a résolu le problème pour moi.


7
c'est vraiment vraiment étrange. Cela a résolu le problème. Une idée quand cela se produit?
MiQUEL

Je pense que vous pouvez le résoudre beaucoup plus facilement en suivant ma réponse du 10 octobre 13
netshark1000

Eu le même problème. Le supprimer et la lecture ont également fonctionné pour moi.
sma

3
Autant que je sache, les insertions de contenu de la vue de défilement sont ajustées automatiquement (si automaticAdjustsScrollViewInsets = YES, ce qui est par défaut) uniquement si la vue de défilement est le premier enfant de la hiérarchie de vue du contrôleur de vue. Je suppose que cette solution fonctionne car après avoir copié-collé la vue de table, ce n'est plus la première vue de la hiérarchie des vues.
lekksi

Ce qui se passe, c'est que lorsque la tableView est la première chose que vous ajoutez à la vue, le système pense qu'il doit laisser de la place pour la navigation. Je suppose ici que certaines personnes ajoutent la tableView, puis l'en-têteView. Après quelques problèmes, ils suppriment la tableView et l'ajoutent à nouveau, ce qui se passe alors, c'est que l'en-têteView est la première chose sur la hiérarchie, de sorte que le système n'a plus besoin de s'adapter, le problème est résolu. Je sais parce que je n'utilise que du code, donc dans mon cas, j'ai dû ajouter d'abord l'en-tête, puis le tableau pour le corriger.
Lluis Gerard

40

Sélectionnez la vue de table dans votre storyboard et assurez-vous que le style est défini sur "Simple" au lieu de "Groupé". Vous pouvez trouver ce paramètre dans l'onglet Inspecteur d'attributs.


incroyable .. c'était la solution pour moi bizarrement .. Je viens de copier et coller tout le contrôleur de vue, mais d'une manière ou d'une autre, la table de ce contrôleur de vue collé avait cet étrange décalage. Cette réponse a résolu mon problème
daisura99

Cela a résolu le problème, mais maintenant les sections d'en-tête se comportent différemment. N'importe qui?
Bruno Muniz

Soyez bénis. Où que vous soyez dans ce monde. Bénissez-vous pour toujours.
gabuchan le

9

Dans mon cas, j'avais un UILabel sous la hiérarchie UITableView in view.

Je l'ai déplacé "vers l'avant" et l'espace vide est apparu. Je ne sais pas pourquoi mais cela fonctionne comme ça, s'il y a quelque chose sous la tableView, cela cache l'espace vide.

Vous pouvez également essayer de cocher / décocher "Ajuster les inserts de vue de défilement" sur votre inspecteur de contrôleur de vue sur le storyboard.

entrez la description de l'image ici


2
J'ai un UITableView groupé et décocher "Ajuster les inserts de vue de défilement" a fonctionné.
Matt

5

AUCUNE de ces réponses ne m'a aidé. mais cela a aidé :

self.tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0)

au lieu de «-64», vous pouvez mettre n'importe quel autre nombre en fonction de la hauteur de votre barre de navigation.


4

Il y a peut-être pré-ajouté UIRefreshControl. J'ai ce problème avec un code comme celui-ci:

self.refreshControl = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your string"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];

}

Comme vous le voyez, je me suis mis self.refreshControllerimmédiatement aprèsinit

Mais, si vous définissez refreshControlaprès la configuration, l'espace supérieur ne vous gêne pas.

UIRefreshControl *refreshControl  = [[UIRefreshControl alloc] init];{
    [self.refreshControl setAttributedTitle:[[NSAttributedString alloc]
                                             initWithString:@"Your String"]];
    [self.refreshControl addTarget:self
                            action:@selector(updateScreen)
                  forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refreshControl;
}

Je ne peux pas croire que c'était le vrai problème. Ce n'est un problème pour moi que sur <= 9.3.5. Comment diable avez-vous compris cela?
Sirens

4

Si vous faites cela sur iOS 11, automaticAdjustsScrollViewInsets ne fonctionnera pas car il est obsolète, le code suivant a fonctionné pour moi selon la réponse dans ce post: https://stackoverflow.com/a/44391269/5476481

        if #available(iOS 11.0, *) {
            tblView.contentInsetAdjustmentBehavior = .never
        } else {
            automaticallyAdjustsScrollViewInsets = false
        }

J'espère que cela t'aides.


4

Dans le Storyboard, définissez le contentInsetsde votre tableviewsur Jamais

entrez la description de l'image ici


3

Je ne peux pas le dire avec certitude, mais il semble que vous ayez un UIView supplémentaire coincé entre le début des cellules prototypes et le haut de UITableView. Mon image ressemble exactement à la vôtre si vous supprimez le texte / les lignes que j'ai ajouté.

entrez la description de l'image ici


3

Je ne suis toujours pas sûr de la cause de cet espace supplémentaire en haut, mais j'ai trouvé que la suppression de UITableView avec l'espace et son remplacement par un nouveau prenait de l'espace.

J'ai dû y glisser un UIView accidentellement, mais je n'ai pas pu le sélectionner et je n'ai pas pu le supprimer.


3

Swift 5

Essayez avec remove tableHeaderView et tableFooterView

var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)

2

Vérifiez votre cadre tableview dans le storyboard ou xib. Le mien par défaut a une valeur de position ay, d'où le bug


2

Dans mon application, j'ai également rencontré un problème comme celui-ci. J'ai défini l'insert de bord supérieur de tableView zéro. Également essayé ensemble falsepour automaticallyAdjustsScrollViewInsets. Mais ça n'a pas marché.

Enfin, j'ai une solution de travail. Je ne sais pas si c'est la bonne manière. Mais l'implémentation de la heightForHeaderInSectionméthode déléguée a fonctionné pour moi. Vous devez renvoyer une valeur différente de zéro pour travailler ceci (le renvoi zéro affichera le même espace qu'avant).

override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {

    return 0.1
}

2

En 2017, ce qui fonctionne pour moi, c'est simplement cette ligne

navigationController? .navigationBar.isTranslucent = false

Je n'ai aucune idée de pourquoi cela l'affecterait même. Quelqu'un pourrait peut-être expliquer. Mais je suis presque sûr que c'est la réponse que la plupart des gens rechercheraient.


Cela l'a fait aussi pour moi. Merci!
scurioni

2

Dans iOS 11 et supérieur, Apple a changé de propriété pour ajuster l'encart de contenu. Utiliser contentInsetAdjustmentBehavioret mettre .neverà supprimer l' espace supplémentaire au- dessus UICollectionView, UIScrollView, UITableView.

if #available(iOS 11.0, *) {

    // For scroll view
    self.scrollView.contentInsetAdjustmentBehavior = .never

    // For collection view
    self.collectionView.contentInsetAdjustmentBehavior = .never

    // For table view
    self.tableView.contentInsetAdjustmentBehavior = .never

} else {
    self.automaticallyAdjustsScrollViewInsets = false
}

J'espère que cela t'aidera.


1

Eh bien, pour moi, le problème est survenu lorsque j'ai fait glisser une cellule prototype du menu dans la vue tableau. J'ai donc supprimé cela et défini simplement la cellule prototype sur 1 dans les propriétés de l'inspecteur de vue tableau


1

Je fais cela par programme, et j'ai simplement déplacé mon addSubview (tableView) vers le bas après avoir ajouté toutes mes autres sous-vues, et cela a résolu mon problème!

Je ne sais pas pourquoi cela n'apparaît que sur l'appareil et non sur mon simulateur, mais dans tous les cas au moins, il existe une solution simple!


1

Tant que UITableView n'est pas la première sous-vue du contrôleur de vue, l'espace vide n'apparaîtra pas.

Solution: ajoutez un objet de vue masqué / effacé (vues, étiquettes, bouton, etc.) comme première sous-vue du contrôleur de vue (au même niveau que l'UITableView mais avant).


J'ai passé tellement de temps à essayer de comprendre cela, à essayer de nombreuses suggestions ici et sur d'autres articles. C'est celui qui l'a résolu. Je vous remercie! Pouvez-vous expliquer pourquoi ou publier un lien vers un document qui le fait? J'apprends juste le développement iOS et c'est tellement différent d'Android! :)
Mark

0

UIView peut être inséré en haut et en bas du tableau (glisser-déposer). Définissez leurs propriétés comme transparent et une hauteur de 1 px. Il s'agit de supprimer le rembourrage supplémentaire devant les cellules.


0

J'ai également eu ce problème, la tableView n'était pas la dernière vue de la hiérarchie. Dans mon cas, j'avais une vue ci-dessus (même s'ils ne se chevauchaient pas), alors je l'ai fait glisser au-dessus de la tableView dans la hiérarchie et cela l'a fait.


0

Je viens de trouver une solution pour cela.

Sélectionnez simplement la vue de la table et cliquez sur Editeur -> Organiser -> Envoyer au premier plan

Cela a fonctionné pour moi et j'espère que cela vous aidera tous.


0

Dans mon cas, j'utilisais ContainerViewController et y mettais UITableViewController. Après avoir supprimé ContainerViewController. Les problèmes disparaissent.


0

Bogue Xcode 8…

Essayez ceci en premier si votre style Storyboard UITableView est défini sur Plain.

Définissez le style de la table sur Groupé, puis de nouveau sur Plain. Cela a supprimé l'espace dans mon application à la tête de mon UITableView.


0

Dans mon cas, j'utilisais une vue conteneur. (Vue principale -> Vue Contaner -> UITableView)

L'espace supplémentaire en haut, je pense, est comme l'espace de la barre de notification de l'appareil (où l'heure est affichée, la batterie). Je fais vraiment, ce n'est pas une hypothèse.

Ce que j'ai fait, c'est depuis UI Builder:

  • sélectionnez le contrôleur de vue de table terminé
  • Ouvrir l'inspecteur d'attributs
  • Allez dans -> Afficher le contrôleur -> Disposition -> "Sélectionner veut plein écran"

0

Vous pouvez utiliser ce code dans viewDidLoad ou viewDidAppear où votre table est créée:

// Remove blank space on header of table view
 videoListUITableView.contentInset = UIEdgeInsetsZero;

// The iOS device = iPhone or iPod Touch
CGSize iOSDeviceScreenSize = [[UIScreen mainScreen] bounds].size;

// Set the height of the table on the basis of number of rows
videoListUITableView.frame = CGRectMake(videoListUITableView.frame.origin.x, videoListUITableView.frame.origin.y, videoListUITableView.frame.size.width, iOSDeviceScreenSize.height-100);



// Hide those cell which doesn't contain any kind of data
self.videoListUITableView.tableFooterView = [[UIView alloc] init];


0

définissez les bords étendus de ViewController dans le storyboard afin que la underTopBarpropriété soit désactivée.


0

Avait le même problème. Je l'ai résolu en ajoutant ce qui suit à viewDidLoad.

self.extendedLayoutIncludesOpaqueBars = true


-2

vérifier

if ([tableView respondsToSelector:@selector(setSeparatorInset:)]) {
    [tableView setSeparatorInset:UIEdgeInsetsZero];
}
  • mentionnez la fonction déléguée tableview cellForRowAtIndexPath:
  • il peut gérer à la fois ios 6 et 7.
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.