J’ai fait glisser un object jane UITableView sur un UIViewController dans iOS 7.
Il y a maintenant un décalage vertical de l’espace avant que la première cellule ne commence. Comment puis-je m’en débarrasser? Je veux que la première ligne soit beaucoup plus proche du bord supérieur de UITableView. Je n’ai pas demandé la grande compensation que j’ai faite?
Des idées?
Par défaut, les contrôleurs de vue de tableau chargent le contenu sous la barre de navigation pour que vous puissiez faire défiler le contenu sous celui-ci et le voir, dans un état flou, sous la barre de navigation / la barre d’outils.
On dirait que vous le positionnez à 44 (peut-être 64) px pour le sortir de la barre de navigation, mais cela compense déjà cela pour que vous obteniez un grand écart.
Allez dans le storyboard / xib dans IB et décochez le contenu de l’affichage sous la barre de navigation.
La nouvelle implémentation iOS 7 d’ UIViewController dispose d’un nouvel ensemble d’options permettant au développeur de choisir si le système appenda automatiquement des encarts pour UIScrollView , UITableView et les dérivations.
Pour désactiver ce comportement, désélectionnez ces cases pour tous vos UIViewControllers souhaités dans InterfaceBuilder, sur l’inspecteur d’objects sélectionné UIViewController :
Pour plus de détails:
A partir du guide de transition iOS7:
Si vous ne souhaitez pas que les encarts de contenu d’une vue de défilement soient automatiquement ajustés, définissez automatiquementAdminAdjustsScrollViewInsets sur NO. (La valeur par défaut de automaticAdjustsScrollViewInsets est YES.)
self.automaticallyAdjustsScrollViewInsets = NO;
J’ai eu un problème similaire, après avoir rejeté un viewController, le contentOffset de mon tableView a été modifié à (0, -64).
ma solution était un peu bizarre, j’ai essayé toutes les autres réponses mais sans succès, la seule chose qui a résolu mon problème était de changer la position de tableView dans l’arborescence des contrôles du fichier .xib
c’était le premier contrôle dans la vue parent comme ceci:
J’ai déplacé la tableView juste après l’ImageView et ça a fonctionné:
il semble que placer la vue de table dans la première position était à l’origine du problème, et déplacer la vue de table dans une autre position a résolu le problème.
PD Je n’utilise pas les storyboards autoLayout
J’espère que cela peut aider quelqu’un!
il résout mon problème similaire:
if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){ tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0); }
Essayez d’utiliser ceci
tableView.separatorInset = UIEdgeInsetsZero;
Évidemment, si vous supportez moins que iOS7, vous devrez vous assurer que l’object répond à ce sélecteur avant de l’appeler.
Sérieusement, changer contentOffset
n’est pas la solution. Vous corrigez simplement un problème et ne corrigez pas la cause. J’ai rencontré le même problème et il s’avère que les tablesViews groupées ont un remplissage sur le dessus. Dans mon cas, définir le type en clair a fait l’affaire.
Espérons que cela économise quelques minutes à quelqu’un. Z.
Avec iOS 9, aucune des autres réponses de cette page n’a fonctionné pour moi (c.-à-d., En décochant les cases dans Storyboard, en définissant automaticallyAdjustsScrollViewInsets
sur NO
).
Ma solution de contournement dont je suis vraiment mécontent était celle-ci:
- (void)viewDidAppear:(BOOL)animated { self.tableView.contentOffset = CGPointMake(0.0, 0.0); self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0); }
Les mêmes lignes dans viewWillAppear
ou viewDidLoad
étaient inefficaces.
Parfois, j’obtiens un écart de hauteur de 64
en haut de ma vue de table lorsque UIViewController
est intégré à un contrôleur de navigation.
Dans le passé, je ne faisais que recréer tout, en espérant que les contraintes se révèlent correctes après une table rase.
TIL: Si vous ne souhaitez pas appliquer de contrainte verticale au Top Layout Guide
, vous pouvez maintenir la touche Option
enfoncée pour accéder à la Container Margin
du Container Margin
.
Assurez-vous ensuite que la constante Top Space to Superview
est définie sur 0
. Cela a fonctionné pour moi au moins.
Cela fonctionne pour moi:
- (void)loadView { [super loadView]; [self setAutomaticallyAdjustsScrollViewInsets:YES]; self.edgesForExtendedLayout = UIRectEdgeNone; self.view.frame = CGRectZero; self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; }
Si vous ajoutez un UIView vide avant que UITableView (ou n’importe quelle vue défilable comme ScrollView et TextView), vous pouvez avoir de la chance.
J’avais un UITableViewController incorporé dans une vue de conteneur. Pour se débarrasser des 64 points d’espace vertical indésirables, je devais décocher l’option Ajuster les encarts de défilement dans Interface Builder et définir le contentInset de UITableView dans la vue viewWillAppear de UITableViewController comme ci-dessous.
La taille de l’espace vertical semble correspondre à la hauteur et au décalage y de la barre de navigation. Le problème est uniquement survenu sur iOS 7.
- (void)viewWillAppear:(BOOL)animated; { [super viewWillAppear:animated]; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { const CGRect navBarFrame = self.navigationController.navigationBar.frame; const CGFloat blankVerticalSpace = navBarFrame.origin.y + navBarFrame.size.height; self.tableView.contentInset = UIEdgeInsetsMake(-blankVerticalSpace, 0, 0, 0); } }
Dans Xamarin iOS, ce problème se produisait sur un UITableViewController en arrière-plan juste après le rejet de la boîte de dialog modale de premier plan. En cours de passage au premier plan, UITableViewController avait des encarts définis (quelque part par iOS):
Cette classe l’a résolu
public class UITableViewControllerWithBugFix : UITableViewController { public UITableViewControllerWithBugFix(UITableViewStyle withStyle) : base(withStyle) { } public override void ViewWillLayoutSubviews() { if (TableView.ContentInset.Top != 0.0f) TableView.ContentInset = UIEdgeInsets.Zero; if (TableView.ScrollIndicatorInsets.Top != 0.0f) TableView.ScrollIndicatorInsets = UIEdgeInsets.Zero; base.ViewWillLayoutSubviews(); } }
De temps en temps, je reviens à cette terrible situation, et je remarque que c’est encore tout à fait inconnu. Donc, pour la mémoire future …
Dernièrement, je corrige avec cette solution de contournement.
Ne me demandez pas pourquoi, je pense toujours que c’est un bug profond dans UIKit.
Si vous accédez au storyboard, vous pouvez modifier le décalage en sélectionnant la table et, sous la section Vue de table de l’inspecteur Atsortingbuts, vous remplacez simplement les séparateurs de gauche par 0.
Je pense que la vraie solution consiste à configurer vos contraintes haut et bas sur la tableview soit égale à la marge supérieure et à la marge inférieure. Pas le guide de mise en page supérieure et le guide de mise en page du bas. Cela vous permet de conserver automatiquement la propriété automaticAdjustsScrollViewInsets.
Solution Swift 3:
class PaddingLessTableView : UITableView { override func headerView(forSection section: Int) -> UITableViewHeaderFooterView? { return nil } override func footerView(forSection section: Int) -> UITableViewHeaderFooterView? { return nil } }
Si vous avez incorporé votre TableViewController dans un NavigationController ou un ContainerView, You have to constraint to margins instead of top Layout guide in Storyboard
. Check constraint to margins when you are doing the constraints
Aucune autre méthode n’a fonctionné pour moi. Je ne pouvais pas commenter alors je ne fais que répéter la réponse de Robert Chens.
J’ai essayé plusieurs des réponses. La modification des parameters dans le storyboard a entraîné des problèmes d’ondulation avec un menu de superposition qui apparaît à gauche.
Je n’ai qu’un UIViewController vide dans le storyboard, sinon tout est généré par programmation.
J’ai le même problème avec un UITableView dans un UIView à l’intérieur d’un UIViewController. À savoir, les en-têtes de section commencent trop loin lorsque l’UIViewController est incorporé dans un contrôleur de navigation. Sans le contrôleur de navigation, tout fonctionne bien.
Pour résoudre le problème, j’ai créé un UILabel et avec des contraintes, j’ai placé la contrainte inférieure UILabel = la contrainte supérieure de UIView (elle ne s’affiche donc pas à l’écran. Maintenant, avec ce contrôle supplémentaire (la nouvelle étiquette), la TableView se comporte correctement.
inputsContainerView.addSubview(titleLabel) inputsContainerView.addSubview(tableView) // inputsContainerView /////////////////////////////////////// inputsContainerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true inputsContainerView.centerYAnchor.constraint(equalTo: view.centerYAnchor, constant: 0).isActive = true inputsContainerView.widthAnchor.constraint(equalTo: view.widthAnchor, constant: -40).isActive = true inputsContainerView.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.7).isActive = true // tableView /////////////////////////////////////// tableView.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true tableView.topAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true tableView.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true tableView.heightAnchor.constraint(equalTo: inputsContainerView.heightAnchor).isActive = true // titleLabel - inserted to stop bad section header behavior /////////////////////////////////////// titleLabel.centerXAnchor.constraint(equalTo: inputsContainerView.centerXAnchor).isActive = true titleLabel.bottomAnchor.constraint(equalTo: inputsContainerView.topAnchor).isActive = true titleLabel.widthAnchor.constraint(equalTo: inputsContainerView.widthAnchor).isActive = true titleLabel.heightAnchor.constraint(equalToConstant: 20).isActive = true
J’ai eu le même problème avec iOS 11 et xib, UITableviewController et je l’ai résolu comme ci-dessous
[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];