web-dev-qa-db-fra.com

Comment obtenir par programme la hauteur de la barre d'état 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étines et de 40 pixels pour les écrans rétines. pour pouvoir le déterminer sans coder en dur. Est-il possible de déterminer la hauteur de la barre d'état par programme?

268
lehn0058

[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. Voyant cette réponse considérée comme utile, je devrais élaborer.

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

  • la barre d'état a été masquée avec la méthode setStatusBarHidden:withAnimation: et sa hauteur est égale à 0,0f points;
  • comme @Anton l'a souligné, lors d'un appel entrant en dehors de l'application Téléphone ou pendant une session d'enregistrement audio, la hauteur de la barre d'état est égale à 40,0 points.

Il existe également un cas de barre d'état affectant 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. Cependant, si vous animez la barre d'état (affichez ou masquez-la) après l'affichage de la vue, la barre d'état changera de cadre, mais la vue ne le 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 est définie sur la valeur finale au début de l'animation).

Mise à jour 2. Il y a aussi un cas d'orientation de l'interface utilisateur. La barre d'état ne respecte pas la valeur d'orientation. La hauteur de la barre d'état pour le mode portrait est donc [UIApplication sharedApplication].statusBarFrame.size.height (oui, l'orientation par défaut est toujours portrait, peu importe ce que dit votre application info.plist), pour paysage - [UIApplication sharedApplication].statusBarFrame.size.width. Pour déterminer l'orientation actuelle de l'interface utilisateur lorsque UIViewController et self.interfaceOrientation ne sont pas disponibles, utilisez [UIApplication sharedApplication].statusBarOrientation.

Mise à jour pour iOS7. Même si le style visuel de la barre d'état a changé, il reste toujours présent, mais son cadre se comporte toujours de la même manière. La seule découverte intéressante concernant la barre d’état que j’ai eue - je partage: votre arrière-plan en mosaïque de UINavigationBar sera également affiché en mosaïque dans la barre d’état. obtenir des effets de conception intéressants ou simplement colorer votre barre d’état. Cela aussi n’affectera en aucune façon la hauteur de la barre d’état.

Navigation bar tiled background is also tiled to status bar

496
Kyr Dunenkoff

Allez avec 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 à Swift

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

Cela ressemble à un bidouillage, mais c'est en fait assez solide. Quoi qu'il en soit, c'est la seule solution qui fonctionne.

Ancienne réponse

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

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

Essaye ça:

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

Swift 3 ou Swift 4:

UIApplication.shared.statusBarFrame.height
16
Wilson

Bien que la barre d'état mesure généralement 20 points, elle peut être le double de ce nombre dans certaines situations:

  • lorsque vous êtes au milieu d'un appel téléphonique (c'est un scénario assez courant);
  • lorsque l'enregistreur vocal, ou Skype, ou une application similaire, utilise le microphone en arrière-plan;
  • quand Personal Hotspot est activé;

Essayez-le et vous verrez par vous-même. Le codage en dur de la hauteur à 20 points fonctionnera généralement, jusqu’à ce que ce ne soit pas le cas.

J'appuie donc la réponse de H2CO3:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
10
Macondo2Seattle

EDIT Le moyen utilisé par iOS 11 pour savoir où placer le haut de votre contenu de vue est UIView's safeAreaLayoutGuide See IView Documentation .

REPONSE DEPRECÉE Si vous ciblez iOS 7+, la documentation de UIViewController indique que la propriété topLayoutGuide de viewController vous indique le bas de l'état. barre, ou le bas de la barre de navigation, si elle est également visible. Cela peut être utile et est certainement moins bidon que beaucoup des solutions précédentes.

9
Joshua J. McKinnon

N'oubliez pas que le cadre de la barre d'état sera dans l'espace de coordonnées de l'écran! Si vous lancez en mode paysage, vous constaterez peut-être que la largeur et la hauteur sont échangées. Je vous recommande fortement d'utiliser cette version du code si vous supportez les orientations paysage:

CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];

Vous pouvez ensuite lire directement la propriété height de statusBarFrame. Dans ce cas, "vue" devrait être la vue dans laquelle vous souhaitez utiliser les mesures, probablement le contrôleur de vue racine de la fenêtre de l'application.

Incidemment, non seulement la barre d'état peut-elle être plus haute pendant les appels téléphoniques, mais elle peut également être nulle si la barre d'état a été délibérément masquée.

5
Ash

Voici un moyen Swift d'obtenir la hauteur de la barre d'état de l'écran:

var screenStatusBarHeight: CGFloat {
    return UIApplication.sharedApplication().statusBarFrame.height
}

Celles-ci sont incluses en tant que fonction standard dans un de mes projets: https://github.com/goktugyil/EZSwiftExtensions

2
Esqarrouth

Par défaut, la hauteur de la barre d'état dans iOS est 20 pt.

Plus d'infos: http://www.idev101.com/code/User_Interface/sizes.html

0
Chris Alan

Je viens de trouver un moyen de ne pas accéder directement à la hauteur de la barre d'état, mais de le calculer.

Hauteur de la barre de navigation - topLayoutGuide length = hauteur de la barre d'état

Rapide:

let statusBarHeight = self.topLayoutGuide.length-self.navigationController?.navigationBar.frame.height

self.topLayoutGuide.length est la zone supérieure couverte par la barre translucide et self.navigationController?.navigationBar.frame.height est la barre translucide excluant la barre d'état, qui est généralement de 44 pt. Ainsi, en utilisant cette méthode, vous pouvez facilement calculer la hauteur de la barre d’état sans s’inquiéter du changement de hauteur de la barre d’état dû aux appels téléphoniques.

0
Henry Ngan