web-dev-qa-db-fra.com

UITableView commence avec un décalage dans iOS 7

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?

enter image description here

Des idées?

114
user798719

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.

81
Cocoadelica

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:

View Controller Inspector

Pour plus de détails:

  1. Soumettez vos applications iOS 7 aujourd'hui.
  2. Guide de la transition de l'interface utilisateur iOS 7> Apparence et comportement
107
xudre

À 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;
68
sovanlandy

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:

before

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

after

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!

34
Chuy47

cela résout mon problème similaire:

if ([[UIDevice currentDevice].systemVersion floatValue] >= 7){
tableView.contentInset = UIEdgeInsetsMake(-20, 0, 0, 0);
}
30
Alex

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.

13
David Attaie

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.

9
Zoltán

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.

8
Dirty Henry

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.

enter image description here

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.

enter image description here

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

enter image description here

5
Robert Chen

Cela fonctionne pour moi:

- (void)loadView
{
    [super loadView];

    [self setAutomaticallyAdjustsScrollViewInsets:YES];

    self.edgesForExtendedLayout = UIRectEdgeNone;
    self.view.frame = CGRectZero;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
}
4
yeahdixon

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.

2
Soft Dev

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();
    }
}
1
Herman Schoenfeld

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.

  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 en confiance :-) Je supprime cette fausse vue, corrige les contraintes sur le dessus et, comme par magie, cela fonctionne.

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

1
klauslanza

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);
    }
}
1
user2067021

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)];
0
dobiho

Swift 3 solution:

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

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

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
0
john

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.

0
Nyctitropist

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.

0
Dan

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.

0
user3296487