J'écris une application qui utilise UITabBar
pour des parties de la navigation. J'utilise aussi UIScrollView
pour présenter plus d'informations que ce que l'écran peut généralement gérer. Pour cette raison, j'ai besoin de configurer la vue de défilement pour prendre en compte la hauteur de la variable UITabBar
afin que toutes les informations soient affichées.
Existe-t-il un moyen de calculer la height
de la UITabBar
?
C'est 320 x 49.
Si vous voulez tester, ouvrez Interface Builder, ajoutez un UITabBar, allez dans la règle, vous le verrez
UITabBar est hérité de UIVIew . Vous pouvez donc utiliser frame.size.height pour obtenir la hauteur.
Si le contrôleur de vue a un ancêtre qui est un contrôleur de barre d’onglet, vous pouvez récupérer la hauteur à partir de cette barre d’onglet.
CGFloat tabBarHeight = self.tabBarController.tabBar.frame.size.height;
Je cherchais à faire quelque chose de similaire en centrant une étiquette dans la partie visible de la vue d'un ViewController. Ce ViewController appartenait à un UITabBarController.
Voici le code que j'ai utilisé pour centrer mon étiquette:
UILabel *roomLabel = [[UILabel alloc] init];
CGRect frame = [[self view] bounds];
float tabBarHeight = [[[super tabBarController] tabBar] frame].size.height;
frame.size.height -= tabBarHeight;
[roomLabel setFrame:frame];
[[self view] addSubview:roomLabel];
[roomLabel release];
Notez que j’ai utilisé [[self view]] []] pas [[self view] frame] car ce dernier inclut la barre supérieure de 20 pixels comme décalage en Y (ce qui éloigne le centrage vertical).
J'espère que cela aide quelqu'un!
Au fait: j'utilise iOS 4.3 et XCode 4 et la valeur "hard-code" de la hauteur du TabBar est toujours de 49 pour moi!
Swift 3+
let tabBarHeight = tabBarController?.tabBar.frame.size.height
print(tabBarHeight ?? "not defined")
Il devrait imprimer 49.0 (Type CGFloat)
En rapide:
let height = self.tabBarController?.tabBar.frame.height ?? 49.0
S'appuyant sur la hauteur réelle de la barre de tabulation et utilisant le nombre magique comme solution de secours.
Cela devrait fonctionner dans la plupart des cas sur n'importe quelle instance de UIViewController:
bottomLayoutGuide.length
Je sais que ce n'est pas idéal, mais je ne voulais vraiment pas avoir un nombre magique constant, où que ce soit. Ce que j'ai fait était de créer un UITabBarController jetable et de prendre de la hauteur.
Je l'ai fait aussi parce que [UITabBar initWithFrame:] fonctionne comme vous le souhaitez, mais que [bar setFrame:] ne fonctionne pas. J'avais besoin que le cadre soit correct à la création.
UITabBarController *dtbc = [[[UITabBarController alloc] init] autorelease];
CGRect tabRect = [[[self navigationController] view] frame];
tabRect.Origin.y = tabRect.size.height - [[dtbc tabBar] frame].size.height;
tabRect.size.height = [[dtbc tabBar] frame].size.height;
tabBar_ = [[UITabBar alloc] initWithFrame:tabRect];
Ce qui me plaît dans cette situation est qu’elle placera correctement la barre d’onglet au bas du parent, quelle que soit sa taille.
Voici comment je l'ai fait fonctionner dans Swift 4.1
let tabBarHeight = CGFloat ((self.tabBarController? .tabBar.frame.size.height)!)