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?
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
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)
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.
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.
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.
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.
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;
}
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.
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.
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.
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.
Vérifiez votre cadre de table en storyboard ou xib. Mine par défaut a une valeur de position y, d’où le bogue
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
}
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!
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.
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).
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
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.
Dans mon cas, j'utilisais ContainerViewController et y mettais UITableViewController. Après avoir supprimé ContainerViewController. Les problèmes disparaissent.
Essayez avec remove tableHeaderView et tableFooterView
var frame = CGRect.zero
frame.size.height = .leastNormalMagnitude
tblView.tableHeaderView = UIView(frame: frame)
tblView.tableFooterView = UIView(frame: frame)
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.
définissez les bords étendus de ViewController dans le storyboard de sorte que la propriété underTopBar
ne soit pas cochée.
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
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:
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.
Avait le même problème. Je l'ai résolu en ajoutant ce qui suit à viewDidLoad.
self.extendedLayoutIncludesOpaqueBars = true
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];
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.