178 votes

Supprimer les espaces vides avant les cellules dans UITableView

J'essaie actuellement de mettre en place un UITableView à un autre endroit plutôt qu'au sommet 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 puisque je n'ai pas de barre de navigation en haut de mon contrôleur.

Si je place le coin supérieur gauche du UITableView à l'endroit où je veux que les cellules soient, il ne les place pas à cet endroit :

Maintenant, si je déplace 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 à cet endroit lorsque l'on fait défiler la page (avec mon doigt au-dessus du contrôleur de navigation) :

Lorsque je lâche la barre de recherche, oui - les cellules se placent juste en dessous de la barre de recherche, mais c'est manifestement un problème, car il est possible de les faire passer au-dessus.

Comment procéder ? Existe-t-il un moyen plus simple ?

379voto

lekksi Points 606

Les cellules de la UITableView s'affichent dans l'espace vide lorsque vous faites défiler le texte vers le bas ?

Si c'est le cas, le problème pourrait venir de l'encart qui est ajouté à l'image. UITableView à cause du contrôleur de navigation que vous avez dans votre vue. L'encart est ajouté à la vue tableau afin que le contenu soit placé sous la barre de navigation lorsqu'il n'y a pas de défilement. Lorsque le tableau défile, le contenu défile et s'affiche sous une barre de navigation transparente. Ce comportement n'est bien sûr souhaitable que si la vue du tableau commence directement sous la barre de navigation, ce qui n'est pas le cas ici.

Il convient également de noter qu'iOS n'ajuste l'encart de contenu que pour la première vue dans la hiérarchie des vues si elle est UIScrollView ou son descendant (par ex. UITableView y UICollectionView ). Si votre hiérarchie de vues comprend plusieurs vues de défilement, automaticallyAdjustsScrollViewInsets n'apportera des ajustements qu'au premier.

Voici comment changer ce comportement :

a) Constructeur d'interface

  • Sélectionner le contrôleur de vue
  • Ouvrir l'inspecteur des attributs
  • Il existe une propriété appelée "Adjust scroll view insets" 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 reproduite avec l'aimable autorisation de <a href="https://stackoverflow.com/users/5785145/dheeraj-d">Dheeraj D </a>)

Je ne suis pas sûr de la version de Xcode qui a introduit cette option (je ne l'ai pas vu dans les notes de version), mais elle est au moins disponible dans la version 5.1.1.

Edit : Pour éviter toute confusion, il s'agit de la troisième option mentionnée dans les commentaires.

b) Par programme

Ajouter ceci à i.e. viewDidLoad (crédits à Slavco Petkovski La réponse de la Commission et la réponse de l Cris R (commentaire de l'auteur)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Ceci pourrait intéresser les anciens élèves

Vous pouvez remédier à ce problème en ajoutant

tableView.contentInset = UIEdgeInsetsZero

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

Ou si vous utilisez IB et que la barre de navigation n'est pas transparente (je ne peux pas le dire à partir de la capture d'écran).

  • Sélectionner le contrôleur de vue
  • Ouvrir l'inspecteur des attributs
  • Dans les options du contrôleur de vue, dans la section "Extend Edges", désélectionnez "Under Top Bars" (sous les barres supérieures).

2 votes

La désélection de l'option "Under Top Bars" dans l'UIView a parfaitement fonctionné pour moi. Je vous remercie.

0 votes

Je devenais fou en utilisant "Pagination activée" et le défilement ne se déplaçait que de la hauteur de la barre de navigation au lieu de la cellule entière. Je vous remercie.

8 votes

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

72voto

irblue Points 345

J'ai eu le même problème et je suis presque sûr que j'ai eu une UIView à un moment donné. Il m'a suffi de copier toute la vue de la table, de la supprimer et de la recoller pour résoudre le problème.

7 votes

C'est vraiment très étrange. Cela a permis de résoudre le problème. Savez-vous quand cela se produit ?

0 votes

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

0 votes

J'ai eu le même problème. Le fait de l'enlever et de le réajuster a également fonctionné pour moi.

48voto

netshark1000 Points 348

Sélectionnez la tableview dans votre storyboard et assurez-vous que le style est défini sur "Plain", au lieu de "Grouped". Vous trouverez ce paramètre dans l'onglet Inspecteur d'attributs.

0 votes

Incroyable c'était la solution pour moi bizarrement J'ai juste copié et collé tout le contrôleur de vue mais d'une manière ou d'une autre le tableView de ce contrôleur de vue collé avait ce décalage bizarre. Cette réponse a résolu mon problème

0 votes

Le problème a été résolu, mais les sections d'en-tête se comportent désormais différemment. Quelqu'un d'autre ?

1 votes

Soyez bénis. Où que vous soyez dans ce monde. Je vous bénis pour toujours.

40voto

Waleed Mahmood Points 145

Vous pouvez le faire à partir de story-boards si vous en utilisez un :

Storyboard.storyboard > YourViewController > Attr. inspector > Décocher "Adjust scroll view insets"

J'espère que cela vous aidera, bravo :-)

35voto

Slavco Petkovski Points 722

Il suffit d'ajouter ce code dans ViewDidLoad

self.automaticallyAdjustsScrollViewInsets = NO;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X