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)
Merci.
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);
}
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 .
Saudações! (Salutations!)
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);
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;
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)
Edit: essayez aussi ceci
self.edgesForExtendedLayout = UIRectEdgeNone;
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:
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:
.
Essayez ce qui suit:
if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
self.edgesForExtendedLayout = UIRectEdgeBottom;
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.
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.
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
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?
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!
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!
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.