288 votes

Comment obtenir par programmation la hauteur de la barre d'état d'iOS ?

Je sais qu'actuellement la barre d'état (avec l'heure, la batterie et la connexion réseau) en haut de l'iPhone/iPad est de 20 pixels pour les écrans non-rétina et de 40 pixels pour les écrans rétina, mais pour assurer l'avenir de mon application, j'aimerais pouvoir déterminer cela sans coder des valeurs en dur. Est-il possible de déterminer la hauteur de la barre d'état de manière programmatique ?

517voto

Kyr Dunenkoff Points 4333

[UIApplication sharedApplication].statusBarFrame.size.height . Mais comme toutes les tailles sont en points et non en pixels, la hauteur de la barre d'état est toujours égale à 20.

Mise à jour. Puisque cette réponse est considérée comme utile, je devrais élaborer.

La hauteur de la barre d'état est, en effet, égale à 20.0f points sauf les cas suivants :

  • La barre d'état a été cachée avec setStatusBarHidden:withAnimation: et sa hauteur est égale à 0,0f points ;
  • comme l'a fait remarquer @Anton, pendant un appel entrant en dehors de l'application Téléphone ou pendant une session d'enregistrement sonore, la hauteur de la barre d'état est égale à 40.0f points.

Il y a aussi le cas de la barre d'état qui affecte la hauteur de votre vue. Normalement, la hauteur de la vue est égale à la dimension de l'écran pour une orientation donnée moins la hauteur de la barre d'état. Toutefois, si vous animez la barre d'état (en l'affichant ou en la masquant) après que la vue a été affichée, la barre d'état changera de cadre, mais la vue ne sera pas vous devrez redimensionner manuellement la vue après l'animation de la barre d'état (ou pendant l'animation, car la hauteur de la barre d'état prend sa valeur finale au début de l'animation).

Mise à jour 2. Il y a aussi une question d'orientation de l'interface utilisateur. La barre d'état ne respecte pas la valeur de l'orientation, donc la valeur de la hauteur de la barre d'état pour l'option portrait le mode est [UIApplication sharedApplication].statusBarFrame.size.height (oui, l'orientation par défaut est toujours le portrait, peu importe ce que dit votre info.plist d'application), pour paysage - [UIApplication sharedApplication].statusBarFrame.size.width . Pour déterminer l'orientation actuelle de l'interface utilisateur lorsqu'elle se trouve à l'extérieur de l'espace de travail. UIViewController y self.interfaceOrientation n'est pas disponible, utilisez [UIApplication sharedApplication].statusBarOrientation .

Mise à jour pour iOS7. Même si le style visuel de la barre d'état a changé, elle est toujours là, son cadre se comporte toujours de la même manière. La seule découverte intéressante que j'ai faite au sujet de la barre d'état - je la partage : votre UINavigationBar 's carreaux L'arrière-plan de la barre d'état sera également étalé sur la barre d'état, ce qui vous permettra d'obtenir des effets de conception intéressants ou de colorer votre barre d'état. Cela n'affectera pas non plus la hauteur de la barre d'état.

Navigation bar tiled background is also tiled to status bar

6 votes

Cette méthode donne 1024 (iOS7)

0 votes

@MarcMosby, cela n'a rien à voir avec iOS7.

0 votes

Alors quelle est la vraie raison ?

104voto

MattDiPasquale Points 23842

Allez-y avec La suggestion de Martin à la question : Obtenir la hauteur de la barre d'état de l'iPhone .

CGFloat AACStatusBarHeight()
{
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size;
    return MIN(statusBarSize.width, statusBarSize.height);
}

Et dans Swift

func statusBarHeight() -> CGFloat {
    let statusBarSize = UIApplication.shared.statusBarFrame.size
    return Swift.min(statusBarSize.width, statusBarSize.height)
}

Ça ressemble à un hack, mais c'est en fait assez solide. En tout cas, c'est la seule solution qui fonctionne.

Ancienne réponse

Le code suivant, qui doit être placé dans votre sous-classe personnalisée de l'application UIViewController a presque fonctionné pour supporter le paysage. Mais, j'ai remarqué un cas de coin (lors de la rotation de droite > à l'envers non pris en charge > à gauche) pour lequel cela n'a pas fonctionné (changement de hauteur et de largeur).

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);

0 votes

Ce n'est pas correct. La hauteur de la barre d'état ne change pas lorsque vous faites pivoter l'appareil. La largeur le ferait, mais le code ci-dessus ne le montre pas, et ce n'était pas la question initiale.

1 votes

Vous avez raison de dire que "la hauteur de la barre d'état ne change pas lorsque vous faites pivoter l'appareil". Mais, comme Ash a répondu En mode paysage, vous pouvez constater que la largeur et la hauteur sont interverties. Le code ci-dessus prend cela en compte.

0 votes

C'est un problème intéressant que j'ai également rencontré. Il me semble qu'il s'agit d'un bogue du côté d'Apple, mais il faut quand même en tenir compte.

23voto

Essayez ça :

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;

1 votes

La hauteur renvoyée dans les différentes orientations est différente. c'est étrange

1 votes

Oui, si la rotation est en paysage - les valeurs de [[UIApplication sharedApplication] statusBarFrame].size.height et [[UIApplication sharedApplication] statusBarFrame].size.width sont interverties.

21voto

Wilson Points 6094

Swift 3 ou Swift 4 :

UIApplication.shared.statusBarFrame.height

10voto

EDIT La méthode utilisée par iOS 11 pour déterminer où placer le haut du contenu de votre vue est la méthode de UIView safeAreaLayoutGuide Voir Documentation sur UIView .

RÉPONSE DÉPRÉCIÉE Si vous visez iOS 7+, la documentation relative à UIViewController conseille d'utiliser l'attribut topLayoutGuide vous donne le bas de la barre d'état, ou le bas de la barre de navigation, si elle est également visible. Cela peut être utile, et c'est certainement moins compliqué que la plupart des solutions précédentes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X