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


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 no retina y 40 píxeles para pantallas retina, pero para preparar mi aplicación para el futuro me gustaría poder determinar esto sin valores de codificación duros. ¿Es posible calcular la altura de la barra de estado mediante programación?

Author: Kyr Dunenkoff, 2012-10-20

11 answers

[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.

Actualización. Viendo que esta respuesta es considerada útil, debería detallarla.

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

  • la barra de estado se ha ocultado con el método setStatusBarHidden:withAnimation: y su altura es igual a 0.0 f puntos;
  • como @ Anton señaló 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.0 f puntos.

También hay un caso de barra de estado que afecta la altura de tu vista. Normalmente, la altura de la vista es igual a la dimensión de la pantalla para una orientación dada menos la altura de la barra de estado. Sin embargo, si anima la barra de estado (mostrarla u ocultarla) después de que se haya mostrado la vista, la barra de estado cambiará su marco, pero la vista no , tendrá que cambiar manualmente el tamaño de la vista después de la animación de la barra de estado (o durante la animación desde el estado altura de la barra establece el valor final al inicio 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 que el valor de altura de la barra de estado para el modo vertical es [UIApplication sharedApplication].statusBarFrame.size.height (sí, la orientación predeterminada siempre es vertical, sin importar la información de su aplicación.plist dice), para paisaje - [UIApplication sharedApplication].statusBarFrame.size.width. Para determinar la orientación actual de la interfaz de usuario cuando no esté disponible fuera de UIViewController y self.interfaceOrientation, use [UIApplication sharedApplication].statusBarOrientation.

Actualización para iOS7. A pesar de que el estilo visual de la barra de estado cambió, sigue ahí, su marco sigue comportándose igual. El único hallazgo interesante sobre la barra de estado que tengo – comparto: su UINavigationBar's mosaico fondo también será mosaico a la barra de estado, por lo que puede lograr algunos efectos de diseño interesantes o simplemente colorear su barra de estado. Esto, también, no 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 a la barra de estado

 481
Author: Kyr Dunenkoff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-05-27 02:06:27

Sigue 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 que funciona.

Antigua respuesta

El siguiente código, que iría en su subclase personalizada de UIViewController, casi funcionó para soportar landscape. Pero, me di cuenta de un caso de esquina (al girar desde la derecha > sin soporte al revés > izquierda) para el que no funcionaba (cambiado altura y anchura).

BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
 90
Author: ma11hew28,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 11:55:10

Prueba esto:

CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
 20
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-10-20 19:36:42

Mientras que la barra de estado es generalmente 20pt de altura, puede ser el doble de esa cantidad en algunas situaciones:

  • cuando estás en medio de una llamada telefónica (eso 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 se activa el Hotspot personal;

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

Así que segundo H2CO3 la respuesta:

statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
 10
Author: Macondo2Seattle,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-05-10 18:34:25

Swift 3 o Swift 4:

UIApplication.shared.statusBarFrame.height
 10
Author: Wilson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-11-30 04:47:29

EDITAR La forma de iOS 11 de averiguar dónde colocar la parte superior del contenido de la vista es safeAreaLayoutGuide Ver Documentación de UIView de UIView.

RESPUESTA OBSOLETA Si está apuntando a iOS 7+, la documentación de UIViewController informa que la propiedad topLayoutGuide de ViewController le da 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 de utilidad, y es ciertamente menos hack que muchas de las soluciones anteriores.

 8
Author: Joshua J. McKinnon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-12-12 22:57:20

¡No olvide que el marco de la barra de estado estará en el espacio de coordenadas de la pantalla! Si inicia en modo horizontal, puede encontrar que el ancho y la altura se intercambian. Le recomiendo encarecidamente que utilice esta versión del código en su lugar si admite orientaciones horizontales:

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

Entonces puede leer la propiedad height de statusBarFrame directamente. 'View' en este caso debe ser la vista en la que desea hacer uso de las mediciones, lo más probable es que la vista raíz de la ventana de la aplicación controlador.

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.

 5
Author: Ash,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-04 17:45:06

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

 2
Author: Esqarrouth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-01-26 20:18:42

Por defecto la altura de la barra de estado en iOS es 20 pt.

Más información: http://www.idev101.com/code/User_Interface/sizes.html

 0
Author: Chris Alan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-03 11:16:23

Acabo de encontrar una forma que te permite no 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

Swift:

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

self.topLayoutGuide.length es el área superior que está cubierta por la barra translúcida, y self.navigationController?.navigationBar.frame.height es la barra translúcida excluyendo la barra de estado, que generalmente es de 44pt. Por lo tanto, 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 al teléfono llamada.

 0
Author: Henry Ngan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-07-20 20:55:02

Usando el siguiente código de una sola línea 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 solo una macro simple pero muy útil solo prueba esto no necesitas escribir ningún código adicional

 -6
Author: Amol Hirkane,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-03 11:10:42