UITableView commence par un décalage dans iOS 7

115

J'ai fait glisser un simple Jane UITableView sur un UIViewController dans iOS 7.

Il y a maintenant un décalage vertical de l'espace avant le début de la première cellule. Comment m'en débarrasser? Je veux que la première ligne soit beaucoup plus proche du bord supérieur de l'endroit où UITableView commence réellement. Je n'ai pas demandé le grand décalage n'est-ce pas?

entrez la description de l'image ici

Des idées?

user798719
la source
43
J'ai été aidé par ce qui suit: YouStoryboard.storyboard> YouViewController> Inspecteur d'attributs> Décocher - Ajuster les inserts de vue de défilement.
Alexander
17
btw, vous pouvez prendre une capture d'écran du simulateur iOS à l'aide de la touche Commande + S
Hemang
@Alexander: J'ai également été aidé avec vos suggestions, mais le fait de décocher ExtendEdges.UnderTopBars a de nouveau fait apparaître l'espace de décalage vertical. Je ne sais pas si c'est l'un des (nombreux?) Bogues de Xcode6, mais ces problèmes me donnent parfois des maux de tête!
iOS-Coder

Réponses:

81

Par défaut, les contrôleurs de vue de table garniront le contenu sous la barre de navigation afin que vous puissiez faire défiler le contenu en dessous 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 déplacer hors 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 sous les éléments de la barre de navigation.

Cocoadelica
la source
6
Pardon, en quoi le commentaire sur NDA sur iOS7 est-il hors de propos? Ceci est un forum pour aider les gens.
Cocoadelica
Dans Xcode Version 5.1 sur Viewcontroller, décochez les bords étendus> Sous les barres supérieures pour supprimer l'encart de contenu UITableView supérieur
Emel Elias
3
Alors, où se trouve le contenu de l'émission sous la barre de navigation thigo? Je ne peux pas le trouver.
Anup Kattel
10
@FrankGorman dans Xcode 5.1.1, il existe une option dans le storyboard pour un contrôleur de vue spécifique est Adjust Scroll View insets, supprimez la coche.
korat prashant
1
hey @koratprashant. commentaire très utile.
KDeogharkar
107

La nouvelle implémentation iOS 7 de UIViewController dispose d'un nouvel ensemble d'options qui permet au développeur de choisir si le système ajoutera automatiquement des insertions pour UIScrollView , UITableView et les dérivés.

Pour désactiver ce comportement, décochez ces cases pour tous vos UIViewControllers voulus dans InterfaceBuilder, sur l' inspecteur d'objet sélectionné UIViewController :

Voir l'inspecteur de contrôleur

Pour plus de détails:

  1. Soumettez vos applications iOS 7 dès aujourd'hui.
  2. Guide de transition de l'interface utilisateur iOS 7> Apparence et comportement
Xudre
la source
Merci! Tu m'as sauvé.
rsc
68

À partir du guide de transition iOS7:

Si vous ne souhaitez pas que les insertions de contenu d'une vue de défilement soient automatiquement ajustées, définissez automatiquementAdjustsScrollViewInsets sur NO. (La valeur par défaut de automaticAdjustsScrollViewInsets est YES.)

   self.automaticallyAdjustsScrollViewInsets = NO;
Sovanlandy
la source
9
Cela peut également être défini dans XCode sur l'inspecteur d'attributs. Décochez la Adjust Scroll View Insetscase de la disposition du contrôleur de vue.
Andrew
1
Si vous chargez l'UIViewController par programme (sans utiliser de XIB), celui-ci fonctionne comme un charme. Défini automaticallyAdjustsScrollViewInsets = NOdans le contrôleur de vue.
KabraBoja
C'était tout pour moi. Confus car mon TableView était à l'intérieur d'une vue de conteneur et semblait initialement correct. Mais il s'est foutu en revenant d'un autre contrôleur de vue.
n13
Génial! Gagnez-moi beaucoup de temps!
inix
34

J'ai eu un problème similaire, après avoir rejeté un viewController, le contentOffset de ma 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 était de changer la position tableView dans l'arborescence des contrôles du .xib

c'était le premier contrôle dans la vue parent comme ceci:

avant

J'ai déplacé la tableView juste après l'ImageView et cela a fonctionné:

après

il semble que mettre la vue de la table en première position causait le problème, et déplacer la vue de la table vers une autre position résolvait le problème.

PD je n'utilise pas autoLayout ni storyboards

j'espère que cela peut aider quelqu'un!

Chuy47
la source
J'ai remarqué la même chose! Je ne mets aucune vue supplémentaire, mais simplement compenser l'écart en déplaçant le haut UITableView -44. Dans IB, il semble que je doive déplacer -64px, mais à l'exécution -64px, la barre de navigation et -44px sont superposées. Je ne peux pas tout à fait l'expliquer. J'ai trouvé ce problème dans la vue popover de l'iPad, alors que je n'ai remarqué aucun problème similaire dans le storyboard de l'iPhone.
Mike Keskinov
Ce problème se pose même avec uiview. si les vues affichées dans l'interface utilisateur ne sont pas placées dans le même ordre.
Rinku
2
J'ai eu le même problème aujourd'hui, avec XCode 6.1. Réfléchissez encore 2-3 heures perdues à essayer de contourner les bugs d'Apple ...
Mike Gledhill
3
Cela a été extrêmement utile et mérite plus d'attention! Aucune manipulation des paramètres du contrôleur de vue ou de l'encart / décalage du contenu n'a aidé, mais la modification de l'ordre des vues dans le storyboard a résolu le problème pour moi.
Caleb
1
Apple, je veux dire ... WTF? Merci mec, ce storyboard a également été corrigé avec mise en page automatique.
Borzh
30

cela résout mon problème similaire:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
Alex
la source
1
Vous devriez vérifier la version du système de cette façon, utilisez:if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
rckoenes
Cela a fonctionné pour moi pour le problème d'espacement que j'avais, mais maintenant mon spinner de contrôle pull-to-refresh apparaît partiellement obscurci et sous mon menu principal. Quelqu'un a vu ça aussi? Des solutions de contournement?
Nick
@ nickv2002 essayez de créer une tableVoir par programme
Alex
J'ai essayé toutes les autres solutions mais seule celle-ci a fonctionné pour moi
DanielR
13

Essayez d'utiliser ceci

tableView.separatorInset = UIEdgeInsetsZero;

Évidemment, si vous prenez en charge quelque chose de moins qu'iOS7, vous devrez vous assurer que l'objet répond à ce sélecteur avant de l'appeler.

David Attaie
la source
4
Je ne sais pas pourquoi cela est voté vers le haut ... separatorInset modifie simplement les lignes de distance entre les cellules sont insérées à partir du bord de la vue. La question concerne l'espace au-dessus et au-dessous des cellules
Rembrandt
L'image est trompeuse, mais une recherche courante sur Google pour le problème de marge donne cette page.
Volonté le
9

Sérieusement, changer contentOffsetn'est pas la solution. Vous corrigez simplement un problème et ne corrigez pas la cause. J'ai été confronté au même problème et il s'avère que les tables groupées ont un rembourrage sur le dessus. Dans mon cas, définir le type sur plain a fait l'affaire.

J'espère que cela fera gagner quelques minutes à quelqu'un. Z.

Zoltán
la source
1
Je l'ai manqué totalement, heureux d'avoir trouvé votre réponse, UPVOTE
AamirR
8

Avec iOS 9, aucune des autres réponses de cette page n'a fonctionné pour moi (c'est-à-dire décocher les cases dans Storyboard, définir automaticallyAdjustsScrollViewInsetssurNO ).

Ma solution de contournement dont je ne suis vraiment pas satisfait était 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 viewWillAppearou viewDidLoadétaient inefficaces.

Sale Henry
la source
Cela devrait être la seule réponse pour uitableviewcontroller iOS 9 ... vraiment, rien d'autre n'a aidé, et je les ai tous essayés, où avez-vous trouvé cela, ou comment l'avez-vous compris? many 10x
Erez
Décocher la Adjust Scroll View insetscase fonctionne pour iOS 9.
Adam
Ajuster les inserts de la vue de défilement ne fonctionne pas pour moi, aucune autre solution?
Yogesh Patel
5

Parfois, j'obtiens un 64écart de hauteur en haut de ma vue tableau lorsque le UIViewControllerest intégré à un contrôleur de navigation.

entrez la description de l'image ici

Dans le passé, je ne faisais que tout recréer, en espérant que les contraintes s'avéreraient correctes après une table rase.

TIL: Si vous ne souhaitez pas appliquer de contrainte verticale au Top Layout Guide, vous pouvez maintenir la Optiontouche enfoncée pour accéder au Container Margin.

entrez la description de l'image ici

Assurez-vous ensuite que la Top Space to Superviewconstante est définie sur 0. Cela a fonctionné pour moi au moins.

entrez la description de l'image ici

Robert Chen
la source
1,5 ans plus tard, mais cela a résolu ma soirée. Merci!
asp_net
4

Cela fonctionne pour moi:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
ouaisdixon
la source
2

Si vous ajoutez un UIView vide avant UITableView (ou n'importe quelle vue peut faire défiler comme ScrollView et TextView), vous pouvez avoir de la chance.

Castor
la source
1

J'avais un UITableViewController intégré dans une vue de conteneur. Pour me débarrasser des 64 points indésirables d'espace vertical, je devais décocher la case `` Ajuster les inserts de vue de défilement '' dans Interface Builder et définir le contentInset de UITableView dans la vue de mon UITableViewController comme ci-dessous.

La taille de l'espace vertical semble correspondre à la hauteur du cadre 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);
    }
}
user2067021
la source
1

Dans Xamarin iOS, ce problème se produisait sur un UITableViewController en arrière-plan juste après la fermeture de la boîte de dialogue modale de premier plan. En train de passer au premier plan, l'UITableViewController avait des insertions définies (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();
    }
}
Herman Schoenfeld
la source
1

De temps en temps, je reviens à cette situation horrible et je constate qu'elle est encore assez inconnue. Donc, pour la mémoire future ...

Dernièrement, je corrige avec cette solution de contournement.

  1. Ajoutez une sous-vue en haut de UITableView, avec une hauteur de zéro pixel. Fonctionne avec Autolayout ou sans.
  2. Si je me sens confiant :-) Je supprime cette fausse vue, corrige les contraintes sur le dessus, et comme par magie ça marche.

Ne me demandez pas pourquoi, je pense toujours que c'est un bug profondément dans UIKit.

Klauslanza
la source
0

Si vous accédez au storyboard, vous pouvez modifier le décalage en sélectionnant le tableau et sous la section Vue du tableau de l'inspecteur d'attributs, il vous suffit de changer les encarts de séparation à gauche sur 0.

Nyctitropiste
la source
0

Je pense que la vraie solution est de configurer vos contraintes supérieure et inférieure sur la vue de la table égales à topMargin et bottomMargin. Pas le guide de disposition supérieur et le guide de disposition inférieur. Cela vous permet de conserver automatiquementAdjustsScrollViewInsets sur true.

Dan
la source
0

Solution Swift 3:

class PaddingLessTableView : UITableView
{
    override func headerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }

    override func footerView(forSection section: Int) -> UITableViewHeaderFooterView?
    {
        return nil
    }
}
hhamm
la source
0

Si vous avez intégré 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 constraintsAucun autre moyen n'a fonctionné pour moi. Je ne pourrais pas faire de commentaire, je répète donc la réponse de Robert Chens.

user3296487
la source
0

J'ai essayé plusieurs des réponses. La modification des paramètres dans le storyboard a causé des problèmes d'ondulation avec un menu de superposition qui apparaît à partir de la gauche.

Je n'ai qu'un UIViewController vide 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 bas lorsque l'UIViewController est intégré dans un contrôleur de navigation. Sans le contrôleur de navigation, tout fonctionne correctement.

Pour résoudre le problème, j'ai créé un UILabel et avec des contraintes placé la contrainte inférieure UILabel = la contrainte supérieure de l'UIView (afin qu'elle ne s'affiche pas à l'écran. Maintenant, avec ce contrôle supplémentaire (le nouveau Label), le 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
John
la source
0

J'ai eu le 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)];
Dobiho
la source