web-dev-qa-db-fra.com

La barre d'onglets couvre les cellules TableView dans iOS7

J'ai un tableViewController personnalisé que j'ajoute à un TabBarController avec

self.tabBarController.viewControllers = [NSArray arrayWithObjects:someOtherViewController, customTableViewController, nil];
self.tabBarController.selectedIndex = 1;

Le problème que je rencontre est que les 1,5 dernières tablesViewCells sont couvertes par la barre d’onglet en bas de l’écran sur un iPhone 4 sous iOS7. Lorsque j'utilise le simulateur iOS - iPhone Retina (4 pouces)/iOS 7.0, le problème persiste.

Quelle est la bonne façon de faire en sorte que tableView s'aligne avec le haut de la barre de tabulation en bas de l'écran sans utiliser de "nombres magiques"?

30
JuJoDi

Essayez ceci pour votre CustomViewController:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UIEdgeInsets adjustForTabbarInsets = UIEdgeInsetsMake(0, 0, CGRectGetHeight(self.tabBarController.tabBar.frame), 0);
    self.scrollView.contentInset = adjustForTabbarInsets;
    self.scrollView.scrollIndicatorInsets = adjustForTabbarInsets;
}
77
dariaa

C'est une solution iOS 8 mais cela peut fonctionner sous iOS 7 pour: Aller dans le storyboard> sélectionner le contrôleur de vue de table> décocher "Sous les barres inférieures". C'est tout! 

example

48
Hans One

Définir la contentInset de votre vue table avec une valeur .bottom de 49 points devrait corriger cela. 

Dans les bonnes configurations, la définition de YES pour la nouvelle propriété UIViewController sur iOS 7 appelée automaticallyAdjustsScrollViewInsets devrait y remédier, mais (encore une fois), cela dépend de nombreux autres facteurs (hiérarchie de vues, paramètres du contrôleur de vue parent, etc.).

7
jaredsinclair

La réponse acceptée ne fonctionne pas vraiment pour moi - ma configuration est un peu différente. Je crée par programme mes contrôleurs de vue. La racine de mon application est un contrôleur de barre d'onglets. Un des onglets est un contrôleur de navigation dont la racine est une UIViewController avec une vue sous forme de tableau comme vue principale.

Ce qui fonctionne pour moi, c’est quand j’ai calculé manuellement la hauteur de la vue tabulaire et que je l’ai défini dans le cadre lors de l’allocation de la vue tabulaire. La formule générale est:

hauteur de l'écran - (hauteur de la barre d'état + hauteur de la barre de navigation + hauteur de la barre d'onglets)

6
Matthew Quiros
CGFloat bottom =  self.tabBarController.tabBar.frame.size.height;
NSLog(@"%f",bottom);
[self.tableview setScrollIndicatorInsets:UIEdgeInsetsMake(0, 0, bottom, 0)];
self.tableview.contentInset = UIEdgeInsetsMake(0, 0, bottom, 0);
5
shadox

Intégrez votre contrôleur de table dans un contrôleur de navigation. 1. sélectionnez la vue dans le story board . 2. Dans la barre de menus, sélectionnez Editeur -> intégrer dans -> contrôleur de navigation. 

J'espère que cela pourra aider

2
Ssemmandarobert

J'ai une hiérarchie de vues similaire à Matt Quiros : UITabBarController -> UINavigationController -> UIViewController -> UITableViewController (intégré à une sous-vue de UIViewController). Les autres réponses ne fonctionnaient pas dans mon cas et je devais définir le cadre de la vue tableau manuellement dans la méthode viewWillAppear: du contrôleur de vue tableau.

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    // Adjust height of tableview (does not resize correctly in iOS 7)
    CGRect tableViewFrame = self.tableView.frame;
    tableViewFrame.size.height = [self heightForTableView];
    self.tableView.frame = tableViewFrame;
}

- (CGFloat)heightForTableView
{
    return CGRectGetHeight([[UIScreen mainScreen] bounds]) -
           (CGRectGetHeight([[UIApplication sharedApplication] statusBarFrame]) +
            CGRectGetHeight(self.navigationController.navigationBar.frame) +
            CGRectGetHeight(self.tabBarController.tabBar.frame));
}

Si quelqu'un trouve une meilleure solution, partagez-la!

1
Steph Sharp

Vous pouvez également implémenter viewDidLayoutSubviews et utiliser bottomLayoutGuide pour obtenir la hauteur de la barre de tabulation:

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];

    CGFloat bottomOffset = self.bottomLayoutGuide.length;

    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, bottomOffset, 0);
}
0
Paul Newman

Bien que la modification de contentInset de votre vue de table soit une solution efficace, je trouve mieux de m'assurer que votre vue de table s'arrête avant la barre d'onglets.

Comme l'a dit Paul Newman, utiliser bottomLayoutGuide est une bonne chose, en particulier si vous utilisez autolayout . Dans mon cas, ajouter une contrainte au bas de la vue tableau reliant le haut du BottomLayoutGuide était une solution propre. exemple avec Storyboard, mais cela peut aussi être fait en code.

enter image description here

J'espère que ça aide.

0
Michael Pirotte

Je pense que cela fonctionnerait mieux pour vous:

Après [super viewDidLoad];

essayez le code suivant:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;
0
DominicanCoder