web-dev-qa-db-fra.com

Obtenir la hauteur de la barre d'état iPhone

J'ai besoin de redimensionner certains éléments par rapport à la hauteur de la barre d'état de l'iPhone. Je sais que la barre d'état est généralement haute de 20 points, mais ce n'est pas le cas quand elle est en mode modem Il est doublé à 40. Quelle est la bonne façon de déterminer sa hauteur? J'ai essayé 

[[UIApplication sharedApplication] statusBarFrame]

mais ça me donne 20 x 480 en paysage ce qui est correct mais ensuite ça me donne 320 x 40 en portrait. Pourquoi ne me donne-t-il pas le contraire (40 x 320)?

60
Kyle Decot

StatusBarFrame renvoie le cadre en coordonnées d'écran. Je pense que la bonne façon d’obtenir ce à quoi cela correspond dans les coordonnées de la vue est la suivante:

- (CGRect)statusBarFrameViewRect:(UIView*)view 
{
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];

    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil];

    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil];

    return statusBarViewRect;
}

Maintenant, dans la plupart des cas, la fenêtre utilise les mêmes coordonnées que l'écran, donc [UIWindow convertRect:fromWindow:] ne change rien, mais dans le cas où elles pourraient être différentes, cette méthode devrait faire la bonne chose.

80
ThomasW

L'as-tu fait comme ça:

CGRect rect;

rect = [[UIApplication sharedApplication] statusBarFrame];
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.Origin.x, rect.Origin.y, rect.size.width, rect.size.height);
14
o15a3d4l11s2

EDIT Le moyen utilisé par iOS 11 pour déterminer où placer le haut du contenu de votre vue est safeAreaLayoutGuide Voir Documentation UIView .

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 la barre d'état 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.

6
Joshua J. McKinnon

Cette méthode fonctionne pour l'orientation portrait et paysage.

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

// example call
float statusBarHeight = [self statusBarHeight];
6
David Douglas

Vous pouvez vérifier quelle est la plus petite des deux valeurs: la hauteur réelle.

5
Martin

Swift 2:

let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height

Swift 3 ou Swift 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height

Conseil: N'oubliez pas d'injecter le UIApplication.shared, n'utilisez pas simplement le singleton dans votre code.

3
nsmeme

Voici la version de Swift si quelqu'un en a besoin:

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

Ceci est inclus en tant que variable standard dans:

https://github.com/goktugyil/EZSwiftExtensions

Disclaimer: C'est mon repo 

0
Esqarrouth