principiantes - Cómo obtener la altura de la barra de estado de iOS mediante programación
manual de usuario gratis tablet apple (11)
Sé que actualmente la barra de estado (con la hora, 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 de 40 píxeles para pantallas de retina, pero para el futuro, mi aplicación me gustaría Para poder determinar esto sin codificar los valores. ¿Es posible calcular la altura de la barra de estado mediante programación?
¡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 están intercambiados. Recomiendo encarecidamente que use esta versión del código en su lugar si admite orientaciones horizontales:
CGRect statusBarFrame = [self.window convertRect:[UIApplication sharedApplication].statusBarFrame toView:view];
A continuación, puede leer la propiedad de altura de statusBarFrame directamente. ''Vista'' en este caso debe 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.
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
Rápido:
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 que excluye la barra de estado, que generalmente es de 44 puntos. 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 a las llamadas telefónicas.
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
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
Prueba esto:
CGFloat statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
Si bien la barra de estado suele ser de 20 pts de altura, 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á usando el micrófono en segundo plano;
- cuando se activa Personal Hotspot;
Solo inténtalo, y lo verás por ti mismo. Codificar la altura a 20 puntos por lo general funcionará, hasta que no lo haga.
Entonces la segunda respuesta de H2CO3:
statusBarHeight = [[UIApplication sharedApplication] statusBarFrame].size.height;
Usando el siguiente código de 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. Intente esto. No necesita escribir ningún código adicional.
Vaya con la sugerencia de Martin a la pregunta: Obtenga 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 hack, pero en realidad es bastante sólido. De todos modos, es la única solución de trabajo.
Respuesta antigua
El siguiente código, que iría en su subclase personalizada de UIViewController
, casi funcionó para soportar el paisaje. Sin embargo, noté un estuche de esquina (al girar desde la derecha> no apoyado hacia abajo> a la izquierda) para el que no funcionó (altura y anchura cambiadas).
BOOL isPortrait = self.interfaceOrientation == UIInterfaceOrientationPortrait;
CGSize statusBarSize = [UIApplication sharedApplication].statusBarFrame.size;
CGFloat statusBarHeight = (isPortrait ? statusBarSize.height : statusBarSize.width);
[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, debo elaborar.
La altura de la barra de estado es, de hecho, igual a 20.0f puntos, excepto en los siguientes casos:
- la barra de estado se ha ocultado con
setStatusBarHidden:withAnimation:
method y su altura es igual a 0.0f puntos; - como lo señaló @Anton aquí, durante una llamada entrante fuera de la aplicación del teléfono o durante la sesión de grabación de sonido, la altura de la barra de estado equivale a 40.0 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 una orientación dada menos la altura de la barra de estado. Sin embargo, si anima la barra de estado (la muestra u oculta) después de que se mostró 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 la altura de la barra de estado se establece en 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 retrato es [UIApplication sharedApplication].statusBarFrame.size.height
(sí, la orientación predeterminada siempre es retrato, no importa lo que diga info.plist de la aplicación), para el paisaje - [UIApplication sharedApplication].statusBarFrame.size.width
. Para determinar la orientación actual de la UI cuando no está disponible UIViewController
y self.interfaceOrientation
no está disponible, use [UIApplication sharedApplication].statusBarOrientation
.
Actualización para iOS7. A pesar de que el estilo visual de la barra de estado cambió, todavía está allí, su marco sigue comportándose igual. El único hallazgo interesante sobre la barra de estado que tengo: lo comparto: el fondo en mosaico de su UINavigationBar
de UINavigationBar
también se incluirá en la barra de estado, por lo que puede lograr algunos efectos de diseño interesantes o simplemente colorear su barra de estado. Esto tampoco afectará de ninguna manera la altura de la barra de estado.
EDITAR La forma de iOS 11 de averiguar dónde ubicar el principio de su contenido visual es la guía de safeAreaLayoutGuide
segura de safeAreaLayoutGuide
Consulte la documentación de UIView .
RESPUESTA DEPRECTA Si está apuntando a iOS 7+, la documentación de UIViewController informa que la propiedad topLayoutGuide de topLayoutGuide
le proporciona la parte inferior de la barra de estado, o la parte inferior de la barra de navegación, si también está visible. Eso puede ser útil, y ciertamente es menos complicado que muchas de las soluciones anteriores.
Swift 3 o Swift 4:
UIApplication.shared.statusBarFrame.height