web-dev-qa-db-fra.com

Supprimer les espaces vides avant les cellules dans UITableView

J'essaie actuellement de placer un UITableView dans 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 prendre en compte la barre de navigation, mais cela n’est pas nécessaire, car je n’ai pas en haut de mon contrôleur.

Si je place le coin supérieur gauche de la UITableView où je veux que les cellules se trouvent, cela ne les place pas à cet endroit:

Maintenant, si je déplace simplement la vue du tableau vers le haut afin que les cellules se trouvent au bon endroit, le problème est différent: les cellules peuvent être déplacées jusque-là lors du défilement (ceci est avec mon doigt au-dessus du contrôleur de navigation):

Oui, lorsque je les lâcherai, les cellules iront juste en dessous de la barre de recherche, mais il est évidemment difficile de les amener au-dessus.

Comment pourrais-je m'y prendre? Y a-t-il un moyen plus simple?

165
hetelek

Les cellules de la variable UITableView apparaissent-elles dans l'espace vide lorsque vous faites défiler l'écran?

Si tel est le cas, le problème peut provenir de l'encart ajouté à la UITableView en raison du contrôleur de navigation affiché. L'encart est ajouté à la vue tableau pour que le contenu soit placé sous la barre de navigation lorsqu'aucun défilement n'a eu lieu. Lorsque le tableau défile, le contenu défile et s'affiche sous une barre de navigation transparente. Ce comportement n’est bien entendu recherché que si la vue tabulaire commence directement sous la barre de navigation, ce qui n’est pas le cas ici.

Une autre chose à noter est que iOS ajuste le contenu inséré uniquement pour la première vue de la hiérarchie si elle est UIScrollView ou son descendant (par exemple, UITableView et UICollectionView). Si votre hiérarchie de vues comprend plusieurs vues de défilement, automaticallyAdjustsScrollViewInsets ne modifiera que la première.

Voici comment changer ce comportement:

a) Interface Builder

  • Sélectionnez le contrôleur de vue
  • Inspecteur des attributs ouverts
  • L'inspecteur d'attributs de IB (lorsqu'un contrôleur de vue est sélectionné) a une propriété appelée "Ajuster les encarts de vue de défilement" qui est activée par défaut. Décocher cette option:


    (Courtoisie d'image 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.

Modifier: pour éviter toute confusion, il s'agissait de la troisième option mentionnée dans les commentaires .

b) par programme

Ajoutez ceci à ie viewDidLoad (crédits à de Slavco Petkovski et à la réponse de Cris R 's commentaire)

// Objective-C
self.automaticallyAdjustsScrollViewInsets = NO;

// Swift
self.automaticallyAdjustsScrollViewInsets = false

c) Cela pourrait être pertinent pour les vieux écoliers

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 (vous ne pouvez pas le savoir à partir de la capture d'écran)

  • Sélectionnez le contrôleur de vue
  • Inspecteur des attributs ouverts
  • Dans les options de View Controller, dans la section Extend Edges, désélectionnez "Under Top Bars".
370
lekksi

J'ai eu le même problème et je suis à peu près sûr que j'ai eu UIView à un moment donné. Le simple fait de copier, de supprimer et de coller à nouveau la vue sous forme de table entière a résolu le problème.

70
irblue

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

33
netshark1000

Dans My Case, j'avais un UILabel sous la hiérarchie de vues UITableView in.

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

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

enter image description here

9
Andre Cytryn

NONE de ce qui précède m'a aidé. mais faire cela a aidé:

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

au lieu de -64, vous pouvez utiliser n'importe quel autre chiffre en fonction de la hauteur de votre barre de navigation.

5
Tung Fam

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

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 règle self.refreshController immédiatement après init

Mais si vous définissez refreshControl après l'installation, l'espace supérieur ne vous gênera 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;
}
4
akaDuality

Je ne peux pas dire avec certitude, mais il semble que vous ayez une carte UIView supplémentaire coincée entre le point de départ des cellules prototypes et le haut de la vue UITableView. Mon image a exactement le même aspect que vous si vous supprimez le texte/les lignes que j’ai ajoutés.

enter image description here

3
Mike S

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

J'ai dû y glisser accidentellement un UIView, mais je ne pouvais pas le sélectionner, donc je ne pouvais pas le supprimer.

3
hetelek

Dans le Storyboard, réglez la contentInsets de votre tableview sur Jamais

enter image description here

Si vous faites cela sur iOS 11, automatiquement, les ajustements AdjustsScrollViewInsets ne fonctionneront pas car il est obsolète, le code suivant a fonctionné pour moi conformément à la réponse de ce message: https://stackoverflow.com/a/44391269/5476481

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

J'espère que cela t'aides.

3
Jacobo Koenig

Dans iOS 11 et les versions ultérieures, Apple a changé de propriété pour ajuster le contenu. Utilisez contentInsetAdjustmentBehavior et définissez .never pour supprimer tout espace supplémentaire situé au-dessus de 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.

2
Mayur Karmur

Vérifiez votre cadre de table en storyboard ou xib. Mine par défaut a une valeur de position y, d’où le bogue

2
Arthi

Dans mon application, j'ai également rencontré un problème comme celui-ci. J'ai mis haut encart de tableView zéro. Également essayé de définir false pour automaticallyAdjustsScrollViewInsets. Mais ça n'a pas marché.

Enfin, j'ai une solution de travail. Je ne sais pas si c'est la bonne façon. Mais implémenter la méthode heightForHeaderInSection delegate a fonctionné pour moi. Vous devez renvoyer une valeur autre que zéro pour que cela fonctionne (le retour zéro affichera le même espace qu'auparavant).

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

    return 0.1
}
2
Anusha Kottiyal

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

Vous ne savez pas pourquoi cela n'apparaît que sur l'appareil et pas sur mon simulateur, mais de toute façon, il existe au moins une solution simple!

1
Austin Whitelaw

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

navigationController? .navigationBar.isTranslucent = false

Je ne sais pas pourquoi cela l'affecterait même. Peut-être que quelqu'un pourrait expliquer. Mais je suis sûr que c'est la réponse que la plupart des gens chercheraient.

1
Dew Time

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é/clair (vues, étiquettes, bouton, etc.) en tant que première sous-vue du contrôleur de vue (au même niveau que UITableView mais avant celui-ci).

1
jr.ong

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 mis la cellule prototype à 1 dans les propriétés de l'inspecteur de vue tableau

1
Junaid Ahmed

Je viens de trouver une solution pour cela.

Il suffit de sélectionner tableview et de cliquer sur Editeur -> Organiser -> Envoyer au premier plan

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

0
Daniel Meza

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

0
Sandeep Ahuja

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)
0
Vivek

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

0
Sebyddd

définissez les bords étendus de ViewController dans le storyboard de sorte que la propriété underTopBar ne soit pas cochée.

0
JAHelia

I just found a solution for this. In my case, i was using TabBarViewController, A just uncheck the option 'Adjust Scroll View Insets'. Issues goes away.https://i.stack.imgur.com/vRNfV.png

0
NitinLandge

Dans mon cas, j’utilisais une vue conteneur (Vue principale -> Vue contaner -> UITableView)

Je pense que l’espace supplémentaire en haut correspond à 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 était à partir du constructeur d'interface utilisateur:

  • sélectionnez le contrôleur de vue de table terminé
  • Inspecteur des attributs ouverts
  • Allez à -> Voir le contrôleur -> Mise en page -> "Sélectionner ce qui est plein écran"
0
Patricio Diego

Xcode 8 bug…

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 de mon application en tête de mon UITableView.

0
Carl

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

self.extendedLayoutIncludesOpaqueBars = true
0
Jose Carrillo

Vous pouvez utiliser ce code dans viewDidLoad ou viewDidAppear à l'endroit 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
Vinod Joshi

UIView peut être inséré en haut et en bas de la table (glisser-déposer). Définissez leurs propriétés comme étant transparentes et d’une hauteur de 1 px. Ceci permet de supprimer le rembourrage supplémentaire devant les cellules.

0
Alexander