2010-10-08 12 views
57

Necesito cambiar el tamaño de algunos elementos en relación con la altura de la barra de estado del iPhone. Sé que la barra de estado suele tener 20 puntos de altura, pero este no es el caso cuando está en modo de anclaje. Se duplica a 40. ¿Cuál es la forma correcta de determinar para determinar su altura? He intentadoObtener barra de estado del iPhone Altura

[[UIApplication sharedApplication] statusBarFrame] 

pero me da 20 x 480 en el paisaje que es correcta, pero luego me da 320 x 40 en el retrato. ¿Por qué no me está dando lo opuesto a eso (40 x 320)?

+0

¿Cómo puede la barra de estado ser 40px? – Andy

+0

@Andy cuando el anclaje está activo, la altura de la barra de estado aumenta a 40px –

+0

O cuando entra una llamada en – SwiftMatt

Respuesta

78

El statusBarFrame devuelve el marco en coordenadas de pantalla. Creo que la manera correcta para conseguir lo que esto corresponde a la vista coordina es hacer lo siguiente:

- (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; 
} 

Ahora bien, en la mayoría de los casos la ventana utiliza las mismas coordenadas que la pantalla, por lo [UIWindow convertRect:fromWindow:] no cambia nada, pero en el caso de que puedan ser diferentes, este método debería hacer lo correcto.

+2

Llamar a este método en '- [UIViewController viewWillAppear:]' no funcionó. Dos problemas: 1. La ventana de la vista es 'nil' entonces. 2. Incluso cuando precedí la llamada a '- [UIWindow convertRect: fromWindow:]' con 'if (view.window)', cuando volví al controlador de vista en modo horizontal, el statusBarFrame tenía el ancho y el alto cambiados y el call to '- [UIView convertRect: fromView:]' no los devolvió correctamente. – ma11hew28

+0

@MattDiPasquale ¿Por qué no llamarlo en 'viewDidAppear:' en su lugar? – ThomasW

+1

Porque, estoy ajustando 'self.collectionView.contentInset' basado en' [UIApplication sharedApplication] .statusBarFrame'. Si lo ajusto después de que aparezca la vista, entonces puede verlo saltar. Entonces, debo ajustarlo antes de que aparezca la vista. – ma11hew28

13

lo hiciste así:

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); 
+0

Sí, lo soy. Lo mencioné en mi pregunta inicial. –

+19

También puede usar NSStringFromCGRect: 'NSLog (@" Marco de la barra de estado:% @ ", NSStringFromCGRect (rect));' – progrmr

+4

¿Cómo se relacionó todo esto con el problema ??? – Andy

5

podría probar lo que es el menor de los dos valores, que será la altura real.

+0

¡Gracias! [Implementé esta idea] (http://stackoverflow.com/a/16598350/242933). ¡Es genial! – ma11hew28

5

Este método funciona para el retrato & orientación horizontal.

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

// example call 
float statusBarHeight = [self statusBarHeight]; 
+0

¿podría darnos más detalles sobre su solución? ¡Gracias! –

+0

Esto se puede usar en la implementación de ViewController. Por ejemplo, en el método 'viewDidLoad'. –

5

EDITAR La forma IOS 11 para calcular dónde poner la parte superior de su contenido de vista es de safeAreaLayoutGuide UIView Ver UIView Documentation.

RESPUESTA DEPRECATED Si usted está apuntando el IOS 7+, la documentación para UIViewController aconseja que topLayoutGuide propiedad del viewController le da la parte inferior de la barra de estado o la parte inferior de la barra de navegación, si es también visible. Eso puede ser útil, y ciertamente es menos hack que muchas de las soluciones anteriores.

0

Aquí está la versión Swift si alguien lo necesita:

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

Esto se incluye como una variable de serie en:

https://github.com/goktugyil/EZSwiftExtensions

Negación: Es mi repo

3

Swift 2:

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

Swift Swift 3 o 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height 

Consejo: No se olvide de inyectar el UIApplication.shared no sólo tiene que utilizar el singleton en el código.

+1

¿Por qué no querría usar el singleton? –

Cuestiones relacionadas