2012-10-07 3 views
9

Mi sono registrato per ricevere notifiche relative alle modifiche alla cornice della barra di stato, ma non vengono mai ricevute.Cambio della barra di stato senza alcuna notifica

Ecco come mi iscrivo per la notifica:

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

In alcuni luoghi la nostra applicazione, abbiamo mostrare/nascondere la barra di stato con:

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

ma può anche modificare la dimensione quando l'hotspot personale è abilitato o in una telefonata. C'è un modo per ottenere la cornice attuale della barra di stato quando cambia?

This question implica che le notifiche non funzionano a causa di un errore di SDK, almeno per le modifiche di orientamento. È questa la ragione? C'è qualche soluzione?

+0

Hmmm ... funziona per me sui cambiamenti di orientamento ma non con setStatusBarHidden. Lo faccio chiamare quando simulo una telefonata sul simulatore. – rdelmar

risposta

6

So che questa domanda è stata postata qualche tempo fa, ma questo problema è fastidioso! Le notifiche UIApplicationWillChangeStatusBarFrameNotification e UIApplicationDidChangeStatusBarFrameNotification attivano solo le modifiche di orientamento e le modifiche di altezza della barra di stato in chiamata.

Ho risolto questo problema scrivendo la mia funzione setStatusBarHidden di categoria che uso al posto della normale funzione UIApplication. Sfortunatamente (come sottolineato da @progrmr), poiché l'altezza della barra di stato potrebbe essere di 20 pixel o 40 pixel (e non abbiamo idea di sapere quale frame di una barra di stato nascosta diventerà fino a dopo che è stato nascosto), possiamo solo abilmente sparare una singola notifica con l'userinfo corretto (UIApplicationDidChangeStatusBarFrameNotification). Ecco quello che ho fatto:

@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 

è leggermente hacky, ma mi piace perché posso usare lo stesso osservatore di notifica per ascoltare sia durante le chiamate di stato modifiche del telaio bar e il mio manuale modifiche del telaio setStatusBarHidden.

Spero che questo aiuti qualcuno!

+0

Questo presuppone che la barra di stato sia alta 20 punti, di solito lo è, ma a volte è 40 (quando in una telefonata, quando l'hotspot è attivo, ecc.), Ma questa è una buona idea. – progrmr

+0

Buon punto. Non sapevo che setStatusBarHidden nasconde effettivamente la barra di stato in-call. Pensavo che nascondesse solo la normale barra di stato. Bene ... Suppongo che tu possa modificare questa funzione solo per attivare la notifica UIApplicationDidChangeStatusBarFrameNotification e passare lungo l'altezza effettiva della barra di stato in userInfo. –

+0

@progrmr Ho corretto la funzione categoria per usare statusBarFrame di UIApplication. Sfortunatamente questo significa che non possiamo più abilitare in modo affidabile la notifica UIApplicationWillChangeStatusBarFrameNotification con il corretto userInfo allegato. –