Cómo obtener mediante programación la altura de la barra de estado de iOS

277

Sé que actualmente la barra de estado (con el tiempo, la batería y la conexión de red) en la parte superior del iPhone / iPad es de 20 píxeles para pantallas sin retina y 40 píxeles para pantallas con retina, pero para probar mi aplicación en el futuro, me gustaría para poder determinar esto sin valores de codificación rígidos. ¿Es posible calcular la altura de la barra de estado mediante programación?

lehn0058
fuente

Respuestas:

506

[UIApplication sharedApplication].statusBarFrame.size.height. Pero como todos los tamaños están en puntos, no en píxeles, la altura de la barra de estado siempre es igual a 20.

Actualizar. Al ver que esta respuesta se considera útil, debería dar más detalles.

La altura de la barra de estado es, de hecho, igual a 20.0f puntos, excepto los siguientes casos:

  • la barra de estado se ha ocultado con el setStatusBarHidden:withAnimation:método y su altura es igual a 0.0f puntos;
  • Como señaló @Anton aquí, durante una llamada entrante fuera de la aplicación del teléfono o durante la altura de la barra de estado de la sesión de grabación de sonido es igual a 40.0f puntos.

También hay un caso de barra de estado que afecta la altura de su vista. Normalmente, la altura de la vista es igual a la dimensión de la pantalla para la orientación dada menos la altura de la barra de estado. Sin embargo, si anima la barra de estado (mostrar u ocultar) después de que se muestra la vista, la barra de estado cambiará su marco, pero la vista no lo hará, deberá cambiar el tamaño manualmente después de la animación de la barra de estado (o durante la animación desde la altura de la barra de estado se establece en el valor final al comienzo de la animación).

Actualización 2. También hay un caso de orientación de la interfaz de usuario. La barra de estado no respeta el valor de orientación, por lo tanto, el valor de altura de la barra de estado para el modo vertical es [UIApplication sharedApplication].statusBarFrame.size.height(sí, la orientación predeterminada es siempre vertical, no importa lo que diga la información de su aplicación), para horizontal - [UIApplication sharedApplication].statusBarFrame.size.width. Para determinar la orientación actual de la IU cuando está fuera UIViewControllery self.interfaceOrientationno está disponible, use [UIApplication sharedApplication].statusBarOrientation.

Actualización para iOS7. Aunque el estilo visual de la barra de estado cambió, todavía está allí, su marco todavía se comporta igual. El único hallazgo interesante de la barra de estado que tiene - que comparten: el UINavigationBarque está alicatado de fondo también se dispondrán en mosaico a la barra de estado, para que pueda lograr algunos efectos interesantes de diseño o simplemente el color de la barra de estado. Esto tampoco afectará la altura de la barra de estado de ninguna manera.

El fondo en mosaico de la barra de navegación también está en mosaico en la barra de estado

Kyr Dunenkoff
fuente
66
Este método produce 1024 (iOS7)
Marc
1
@MarcMosby, mira mi actualización. Recordaba este problema, gracias a ti.
Kyr Dunenkoff
2
Sí, como Marc señaló en iOS7, a veces genera 1024 a veces y 20 a veces. Así que esto ya no es una forma infalible de determinar la altura. Dudo que esto se deba a la naturaleza transparente de la barra de estado en iOS 7. Podría ser eso, primero pasa a pantalla completa y luego cambia de tamaño. Entonces, si realiza consultas en la aplicación durante esta transición, es posible que obtenga el valor incorrecto. Puede estar llamando a este método con un retraso podría ayudar en iOS 7.
Deepak GM
1
Hay un caso donde la altura de la barra de estado puede ser cero. Si supportInterfaceOrientations () devuelve UIInterfaceOrientation (resultado incorrecto pero no hay error del compilador) en lugar de UIInterfaceOrientationMask y se presenta y descarta un controlador de vista, la altura de la barra de estado será cero.
Cymric
55
También en el iPhone X la barra de estado será más alta.
antes del
98

Vaya con la sugerencia de Martin a la pregunta: Obtener la altura de la barra de estado del iPhone .

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

Y en Swift

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

Parece un truco, pero en realidad es bastante sólido. De todos modos, es la única solución de trabajo.

Vieja respuesta

El siguiente código, que iría en su subclase personalizada de UIViewController, casi funcionó para soportar el paisaje. Pero, noté un caso de esquina (cuando giraba desde la derecha> no compatible al revés> izquierda) para el que no funcionaba (altura y ancho cambiados).

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
ma11hew28
fuente
Esto no es correcto. La altura de la barra de estado no cambia cuando gira el dispositivo. El ancho sí, pero el código anterior no muestra eso, ni esa era la pregunta original.
lehn0058
1
Tiene razón en que "la altura de la barra de estado no cambia cuando gira el dispositivo". Pero, como Ash respondió , "en modo horizontal, es posible que el ancho y la altura se intercambien". El código anterior tiene eso en cuenta.
ma11hew28
Este es un tema interesante que he estado viendo ahora también. A mí me parece un error por parte de Apple, pero aún debe tenerse en cuenta.
lehn0058
2
@ lehn0058 No es un error, es cómo Apple maneja la barra internamente. Se adjunta a una ventana y esa ventana se gira mediante una transformación. El statusBarFramese devuelve como el valor antes de la transformación.
Leo Natan
1
Se ve mejor como una propiedad: Dvar statusBarHeight: CGFloat
Pablo A.
23

Prueba esto:

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

fuente
1
La altura devuelta en diferentes orientaciones es diferente. eso es extraño
tGilani
1
Sí, si la rotación es horizontal: [[UIApplication sharedApplication] statusBarFrame] .size.height y [[UIApplication sharedApplication] statusBarFrame] .size.width se cambian.
Guntis Treulands
21

Swift 3 o Swift 4:

UIApplication.shared.statusBarFrame.height
Wilson
fuente
10

Si bien la barra de estado generalmente tiene una altura de 20 puntos, puede ser el doble de esa cantidad en algunas situaciones:

  • cuando estás en medio de una llamada telefónica (ese es un escenario bastante común);
  • cuando la grabadora de voz, o Skype, o una aplicación similar, está utilizando el micrófono en segundo plano;
  • cuando el punto de acceso personal está activado;

Solo pruébalo y lo verás por ti mismo. Codificar la altura a 20pt generalmente funcionará, hasta que no lo haga.

Así que secundo la respuesta de H2CO3:

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

EDITAR La manera de iOS 11 de averiguar dónde colocar la parte superior del contenido de su vista es safeAreaLayoutGuideVer la documentación de UIView de UIView .

RESPUESTA DESAPROBADA Si está apuntando a iOS 7+, la documentación para UIViewController informa que la topLayoutGuidepropiedad viewController le proporciona la parte inferior de la barra de estado, o la parte inferior de la barra de navegación, si también es visible. Eso puede ser útil, y ciertamente es menos pirateo que muchas de las soluciones anteriores.

Joshua J. McKinnon
fuente
5

¡No olvide que el marco de la barra de estado estará en el espacio de coordenadas de la pantalla! Si inicia en modo horizontal, es posible que el ancho y la altura se intercambien. Le recomiendo que use esta versión del código si admite orientaciones horizontales:

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

Luego puede leer la propiedad de altura de statusBarFrame directamente. 'Vista' en este caso debería ser la vista en la que desea hacer uso de las mediciones, probablemente el controlador de vista raíz de la ventana de la aplicación.

Por cierto, la barra de estado no solo puede ser más alta durante las llamadas telefónicas, sino que también puede ser cero si la barra de estado se ha ocultado deliberadamente.

Ceniza
fuente
Esto no me dio la altura correcta. Pero, encontré una forma diferente que funcionó para mí: stackoverflow.com/a/16598350/242933
ma11hew28
Sí, este es un código bastante antiguo ahora, por lo que probablemente ya no sea una respuesta válida. Personalmente, ya no tengo ninguna necesidad de verificar la altura de la barra de estado, gracias al diseño automático.
Ash
2

Aquí hay una forma rápida de obtener la altura de la barra de estado de la pantalla:

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

Estos se incluyen como una función estándar en un proyecto mío: https://github.com/goktugyil/EZSwiftExtensions

Esqarrouth
fuente
2

Para iOS 13 puedes usar:

UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
Eugene Lezov
fuente
1
    var statusHeight: CGFloat!
    if #available(iOS 13.0, *) {
         statusHeight = UIApplication.shared.keyWindow?.windowScene?.statusBarManager?.statusBarFrame.height
    } else {
        // Fallback on earlier versions
        statusHeight = UIApplication.shared.statusBarFrame.height
    }
Bassant Ashraf
fuente
0

Acabo de encontrar una manera que no le permite acceder directamente a la altura de la barra de estado, sino calcularla.

Altura de la barra de navegación - topLayoutGuide length = altura de la barra de estado

Rápido:

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

self.topLayoutGuide.lengthes el área superior que está cubierta por la barra translúcida, y self.navigationController?.navigationBar.frame.heightes la barra translúcida excluyendo la barra de estado, que generalmente es de 44 puntos. Entonces, al usar este método, puede calcular fácilmente la altura de la barra de estado sin preocuparse por el cambio de altura de la barra de estado debido a llamadas telefónicas.

Henry Ngan
fuente
Esto no funciona, self.topLayoutGuide.lengthes 0, por lo que el resultado termina siendo -44.
nambatee
@nambatee Creo que ya no funciona porque soy iOS 11 Apple usa safeAreaInsets
Henry Ngan
0

Swift 5

UIApplication.shared.statusBarFrame.height

Haspinder Singh
fuente
-6

Usando el siguiente código de línea única puede obtener la altura de la barra de estado en cualquier orientación y también si es visible o no

#define STATUS_BAR_HIGHT (
    [UIApplicationsharedApplication].statusBarHidden ? 0 : (
        [UIApplicationsharedApplication].statusBarFrame.size.height > 100 ?
            [UIApplicationsharedApplication].statusBarFrame.size.width :
            [UIApplicationsharedApplication].statusBarFrame.size.height
    )
)

Es una macro simple pero muy útil, solo prueba esto, no necesitas escribir ningún código adicional

Amol Hirkane
fuente