web-dev-qa-db-fra.com

iOS 7 TableView personnalisé est sous TabBar

J'essaie de porter mon application sur iOS7, mais ma coutume TableViewController affiche la dernière ligne (cellule) sous la TabBar :(

Je cherche beaucoup pour cela, mais je ne trouve aucune solution. Quelqu'un peut-il m'aider?

Ma classe d'affichage de table personnalisée

L'erreur est montrée sur la capture d'écran de coup (seule une partie du dernier produit est montrée, car je montre jusqu'à montrer le produit caché sous la barre de tabulation)

screenshot

Merci.

30
Paulo Coutinho

J'ai trouvé la réponse à votre question sur un autre post, répondu par dariaa, ici:

La barre d'onglets couvre les cellules TableView dans iOS7

Cela a très bien fonctionné pour moi.

S'il vous plaît, aucun crédit pour moi, car je ne suis pas le gars d'origine qui a résolu le problème.

Dans votre TableViewController personnalisé, ajoutez ces deux lignes sous [super viewDidLoad]:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.tableView.contentInset = UIEdgeInsetsMake(0., 0., CGRectGetHeight(self.tabBarController.tabBar.frame), 0); 
} 
29
Wojtek

J'ai le même problème et je l'ai résolu à l'aide du storyboard . Dans Contrôleur de la barre de tabulation, accédez à l'inspecteur d'attributs, Métriques simulées, et définissez la barre inférieure sur Barre de tabulation opaque. C'est ça! Voir l'image ci-dessous pour la description .enter image description here

Saudações! (Salutations!)

34
José Flávio

2 lignes dans viewDidLoad et c'est tout! 

self.edgesForExtendedLayout = UIRectEdgeAll;
self.tableview.contentInset = UIEdgeInsetsMake(0.0f, 0.0f, CGRectGetHeight(self.tabBarController.tabBar.frame), 0.0f);
8
Matthieu Riegler

Mes amis, je ne peux pas vous dire à quel point j'ai lutté contre cela. Pas une seule reconfiguration de Story Board ne m'a jamais aidé. Le problème était exactement comme dans Original Post, j'ai réussi à le réparer en utilisant:

pour Swift 3

self.edgesForExtendedLayout = []

pour objectif-c

self.edgesForExtendedLayout = NO;
8
An Se

Dans iOS 7, viewController utilise toute la hauteur. Il y a une propriété présentée comme 

self.automaticallyAdjustsScrollViewInsets = NO;

régler à non. puis cochez ou définissez UIEdgeInset si n’est pas défini juste après.

UIEdgeInsetsMake(top, left, bottom, right)

Voir ici https://developer.Apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html

Edit: essayez aussi ceci 

self.edgesForExtendedLayout = UIRectEdgeNone;
6
Raheel Sadiq

La cause première de ce problème est que automaticallyAdjustsScrollViewInsets est efficace uniquement dans la vue Première scroll dans la hiérarchie des vues de votre VC. Cela n’est pas documenté par Apple, mais c’est la seule façon pour le VC de détecter la vue de défilement devant être modifiée, sauf si vous utilisez un UITableViewController.

Donc, afin de résoudre votre problème sans régler manuellement les encarts, procédez comme suit: 

  1. Assurez-vous que "Ajuster les incrustations de la vue de défilement" est coché.
  2. Assurez-vous que la tableView est la sous-vue first dans la vue Hiérarchie ..__ (déplacez-la vers le haut au-dessus de tous les autres éléments).
5
AmitP

UIViewController a deux nouvelles propriétés pour vous aider: topLayoutGuide et bottomLayoutGuide. Ils renvoient la hauteur des commandes du contrôleur de vue parent à éviter. Dans ce cas, bottomLayoutGuide renverra le décalage de la barre d'onglets. 

Votre contrôleur de vue personnalisé substitue probablement une méthode et n'appelle pas l'implémentation de super lorsque cela serait fait pour vous. J'imagine que vous installez des contraintes de mise en forme automatique ou que vous définissez le cadre d'une vue manuellement pour remplir la vue. Vous devez simplement inclure la valeur de [bottomLayoutGuide length] dans votre calcul de présentation. Si vous prenez en charge la rotation, vous devez mettre à jour cette valeur dans willAnimateRotationToInterfaceOrientation:duration:.

2
Fruity Geek

J'ai le même problème. Une solution consiste à rendre la barre d'outils non translucide. Voici comment le faire:

  • Sélectionnez d’abord la barre d’outils dans la visionneuse de documents comme ici
  • Puis décochez Translucentcomme ici

J'espère que cela t'aides.

Merci.

1
Minas Kamel

Essayez ce qui suit:

 if ([self respondsToSelector:@selector(edgesForExtendedLayout)])

 self.edgesForExtendedLayout = UIRectEdgeBottom;
1
asolakhyan

UINavigationController et UITabBarController ont tous deux un indicateur de transparence qui peut être défini par programme ou dans le storyboard.

La variable UINavigationController comporte également deux indicateurs qui contrôlent si le contenu s'étend sous la barre supérieure ou inférieure. Encore une fois, vous pouvez les définir par programme ou dans le storyboard. Cela s'appliquera à toutes les sous-vues.

Chaque UIViewController peut définir sa propre préférence dans le code. La propriété s'appelle edgesForExtendedLayout et vous pouvez configurer toutes les combinaisons.

L'utilisation de ces propriétés permettra à AutoLayout et Springs'n'Struts de régler les vues comme vous le souhaitez, quel que soit le périphérique.

Il y a beaucoup plus de nouvelles propriétés dans UIViewController que vous voudrez jeter un coup d'œil.

1
Helge Becker

J'ai résolu mon problème maintenant, en modifiant BaseTableViewController pour qu'il hérite d'UIViewController en UITableViewController.

Mais utiliser un TableView à l'intérieur d'un UIViewController n'est pas résolu :(

Merci.

0
Paulo Coutinho

Pour ceux comme xarly qui veulent l'effet translucide, et pour une solution Autolayout (sans réglage de cadres), voir ma réponse ici https://stackoverflow.com/a/26419986/1158074

0
Michael Pirotte

peut-être que ce n’est pas une bonne réponse, c’est aussi pour cette raison que je poste cette réponse pour que vous puissiez me dire si cette réponse pourrait être une solution possible.

Dans mon cas, j'aime l'effet translucide. J'ai donc ajouté un pied de page dans le tableau et modifié les scrollIndicators.

- (void)viewDidLoad
{
    // Do any additional setup after loading the view.
    [super viewDidLoad];
    UIView *footer = [[UIView alloc]initWithFrame:CGRectMake(0, 0, self.agendaItemsTable.frame.size.width, self.tabBarController.tabBar.frame.size.height)];
    self.agendaItemsTable.tableFooterView = footer;
    self.agendaItemsTable.scrollIndicatorInsets = UIEdgeInsetsMake(0, 0, self.tabBarController.tabBar.frame.size.height, 0);

}

Qu'est-ce que tu penses?

0
xarly

J'ai eu un problème similaire avec vue de la collection. Changer le cadre de la vue de collection et l'encadré de contenu ci-dessous l'ont corrigé pour moi ...

    guard let cv = collectionView,
        let tabBar = tabBarController?.tabBar else { return }

    // Resize collection view for tab bar
    let adjustedFrame = CGRect(Origin: cv.frame.Origin,
                               size: CGSize(width: cv.frame.width, height: cv.frame.height - tabBar.frame.height))
    cv.frame = adjustedFrame

    // Adjust content inset for tab bar
    let adjustedContentInsets = UIEdgeInsetsMake(0, 0, tabBar.frame.height, 0)
    cv.contentInset = adjustedContentInsets
    cv.scrollIndicatorInsets = adjustedContentInsets

Bonne chance!

0
nananta

J'ai eu le même problème et les réponses positives n'ont pas résolu le problème. Voir ma réponse à une question similaire, La barre d'onglets couvre les cellules de TableView dans iOS7 .

J'ai résolu le problème en définissant manuellement le cadre de la vue tableau dans la méthode viewWillAppear: du contrôleur de vue tableau à la hauteur de l'écran - (hauteur de la barre d'état + hauteur de la barre de navigation + hauteur de la barre de tabulation).

- (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 à ce problème, partagez-le!

0
Steph Sharp

Le problème a été masqué en utilisant:

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 112, 0);
}

Mais cela ne résout pas le problème, car sur chaque iPhone et sur chaque application, j'ai un espace différent en bas. 

C'est donc une mauvaise solution.

Je ne sais pas comment le résoudre.

0
Paulo Coutinho