2012-10-07 19 views
9

Me he registrado para recibir notificaciones sobre los cambios en el marco de la barra de estado, pero nunca se reciben.Cambios en el marco de la barra de estado sin ninguna notificación

Así es como me registro para la notificación:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(appWillChangeStatusBarFrameNotification:) 
              name:UIApplicationWillChangeStatusBarFrameNotification 
              object:nil]; 

En algunos lugares de nuestra aplicación, que mostrar/ocultar la barra de estado con:

[[UIApplication sharedApplication] setStatusBarHidden:maximize 
             withAnimation:UIStatusBarAnimationSlide]; 

pero también puede cambiar de tamaño cuando punto de acceso personal está habilitado o cuando está en una llamada telefónica. ¿Hay alguna forma de obtener el marco de la barra de estado real cuando cambia?

This question implica que las notificaciones no funcionan debido a un error de SDK, al menos para los cambios de orientación. ¿Esa es la razón? ¿Hay algún trabajo alrededor?

+0

Hmmm ... funciona para mí en cambios de orientación pero no con setStatusBarHidden. Me llaman cuando simulo una llamada telefónica en el simulador. – rdelmar

Respuesta

6

Sé que esta pregunta fue publicada hace un tiempo, ¡pero este problema es molesto! Las notificaciones UIApplicationWillChangeStatusBarFrameNotification y UIApplicationDidChangeStatusBarFrameNotification solo se activan con cambios de orientación y cambios en la altura de la barra de estado durante la llamada.

Lo resolví escribiendo mi propia función de categoría setStatusBarHidden que uso en lugar de la función normal UIApplication. Desafortunadamente (como se señaló @progrmr), porque la altura de la barra de estado puede ser de 20 o 40 píxeles (y no tenemos idea de saber qué será el marco de la barra de estado oculta hasta que no se oculte), solo podemos disparar de manera confiable una sola notificación con la userInfo correcta (UIApplicationDidChangeStatusBarFrameNotification). Esto es lo que hice:

@implementation UIApplication (statusBar) 

- (void)setStatusBarHiddenWithNotification:(BOOL)hidden withAnimation:(UIStatusBarAnimation)animation 
{ 
    if (self.statusBarHidden == hidden) return; 

    [self setStatusBarHidden:hidden withAnimation:animation]; 
    [NSNotificationCenter.defaultCenter postNotificationName:UIApplicationDidChangeStatusBarFrameNotification 
                 object:nil 
                userInfo:@{UIApplicationStatusBarFrameUserInfoKey: [NSValue valueWithCGRect:self.statusBarFrame]}]; 
} 

@end 

Es un poco hacky, pero me gusta porque puedo usar el mismo observador notificación para escuchar ambas estado cambia marco de la barra de llamada entrante y mis cambios de marco setStatusBarHidden manuales.

Espero que esto ayude a alguien!

+0

Esto supone que la barra de estado tiene 20 puntos de alto, por lo general, pero a veces es 40 (cuando se realiza una llamada telefónica, cuando el punto de acceso está activo, etc.), pero esta es una buena idea. – progrmr

+0

Buen punto. No sabía que setStatusBarHidden realmente oculta la barra de estado de la llamada entrante. Pensé que solo ocultaba la barra de estado normal. Bueno ... supongo que puede modificar esta función para que solo active la notificación UIApplicationDidChangeStatusBarFrameNotification y pase la altura real de la barra de estado en userInfo. –

+0

@progrmr He arreglado la función de categoría para usar el marco de barra de estado de UIApplication. Desafortunadamente, esto significa que ya no podemos iniciar de forma confiable la notificación UIApplicationWillChangeStatusBarFrameNotification con la userInfo correcta adjunta. –

Cuestiones relacionadas