J'ai fait glisser un simple UITableView jane sur un UIViewController dans iOS 7.
Il existe maintenant un décalage vertical de l'espace avant le début de la première cellule. Comment puis-je m'en débarrasser? Je souhaite que la première ligne soit beaucoup plus proche du bord supérieur du début de la vue UITableView. Je n'ai pas demandé le gros offset, n'est-ce pas?
Des idées?
Par défaut, les contrôleurs de vue sous forme de tableau insèrent le contenu sous la barre de navigation pour que vous puissiez le faire défiler et le voir, dans un état flou, sous la barre de navigation/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, vous obtenez donc un grand écart.
Accédez au storyboard/xib dans IB et décochez le contenu de l’émission dans la barre de navigation.
La nouvelle implémentation iOS 7 de UIViewController comporte un nouvel ensemble permet au développeur de choisir si le système ajoutera automatiquement des encarts pour UIScrollView , UITableView et dérivations.
Pour désactiver ce comportement, décochez ces cases pour tous vos UIViewControllers recherchés dans InterfaceBuilder, sur UIViewController , inspecteur d'objets sélectionnés:
Pour plus de détails:
À partir du guide de transition iOS7:
Si vous ne souhaitez pas que les encarts de contenu de la vue de défilement soient ajustés automatiquement, définissez automatiquementAdjustsScrollViewInsets sur NO. (La valeur par défaut de automatiquementAdjustsScrollViewInsets 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é changé en (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 a été de changer la position de la table dans l'arborescence des contrôles du .xib.
c'était le premier contrôle dans la vue parent comme ceci:
J'ai déplacé la tableView juste après la ImageView et cela a fonctionné:
il semble que placer la vue de table dans la première position posait problème, et déplacer la vue de table à une autre position a résolu le problème.
P.D. Je n'utilise ni autoLayout ni les scénarimages
espérons que cela peut aider quelqu'un!
cela 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;
De toute évidence, si vous ne prenez pas en charge iOS7, vous devez vous assurer que l'objet répond à ce sélecteur avant de l'appeler.
Sérieusement, changer contentOffset
n'est pas la solution. Vous ne faites que corriger un problème et non résoudre le problème. Je suis confronté au même problème et il s’avère que grouped tableViews a un padding sur le dessus. Dans mon cas, définir le type sur plain 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 ne fonctionnait pour moi (par exemple, en décochant des cases dans Storyboard, en définissant automaticallyAdjustsScrollViewInsets
sur NO
).
Ma solution de contournement qui m’inquiète vraiment est la suivante:
- (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, un écart de hauteur 64
se trouve en haut de la vue Tableau lorsque la variable UIViewController
est intégrée à un contrôleur de navigation.
Dans le passé, je voulais simplement tout recréer, en espérant que les contraintes s'avéreraient correctes après une table rase.
TIL: Si vous ne voulez pas imposer de contrainte verticale au Top Layout Guide
, vous pouvez maintenir la touche Option
enfoncée pour accéder au 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 une UIView vide avant UITableView (ou si une vue est défilable telle que ScrollView et TextView), vous pouvez avoir de la chance.
Dans Xamarin iOS, ce problème se produisait sur un UITableViewController en arrière-plan juste après que la boîte de dialogue modale de premier plan avait été fermée. Dans le processus 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 situation épouvantable et je remarque que c'est encore assez inconnu. Donc, pour la mémoire future ...
Dernièrement, je résous avec cette solution de contournement.
Ne me demandez pas pourquoi, je pense toujours que c'est un bug profond dans UIKit.
J'avais un UITableViewController intégré dans une vue de conteneur. Pour supprimer les 64 points non souhaités d'espace vertical, je devais décocher la case "Ajuster les incrustations d'affichage de défilement" dans Interface Builder et définir le contentInset de UITableView dans mon 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 ne s'est produit que 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);
}
}
J'ai eu un même problème dans iOS 11 et xib, UITableviewController et je l'ai résolu comme ci-dessous
[self.tableView setContentInset:UIEdgeInsetsMake(-44,0,0,0)];
Swift 3 solution:
class PaddingLessTableView : UITableView
{
override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
{
return nil
}
}
J'ai essayé plusieurs des réponses. La modification des paramètres dans le storyboard a entraîné des problèmes d’ondulation avec un menu superposé qui apparaît à partir de la gauche.
Je n'ai qu'un UIViewController vierge dans le storyboard, sinon tout est généré par programme.
J'ai le même problème avec un UITableView à l'intérieur d'un UIView à l'intérieur d'un UIViewController. À savoir, les en-têtes de section commencent trop loin lorsque 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, la contrainte inférieure UILabel = la contrainte supérieure de UIView (elle ne s'affiche donc pas à l'écran. Désormais, avec ce contrôle supplémentaire (la nouvelle étiquette), 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
Si vous allez dans le storyboard, vous pouvez modifier le décalage en sélectionnant le tableau et, dans la section Vue du tableau de l'inspecteur Attributs, il vous suffit de changer à 0 les inserts de séparation situés à gauche.
Je pense que la vraie solution consiste à configurer vos contraintes top et bottom sur la vue table de manière à ce qu'elles soient égales à topMargin et bottomMargin. Pas le guide de disposition supérieur et le guide de disposition inférieur. Cela vous permet de conserver automatiquement la valeur true à AdjustsScrollViewInsets.
Si vous avez intégré votre TableViewController à 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 solution n'a fonctionné pour moi. Je ne peux pas commenter, alors je ne fais que répéter la réponse de Robert Chens.