2014-05-24 14 views
15

Come posso rilevare se l'utente è in chiamata o tethering? Ho una visualizzazione secondaria per iAd come questo:Rilevare se l'utente ha nella barra di stato della chiamata

_UIiAD = [[self appdelegate] UIiAD]; 
    _UIiAD.delegate = self; 

    [_UIiAD setFrame:CGRectMake(0,470,320,50)]; 
    [self.view addSubview:_UIiAD];\ 

e pone sbagliato quando l'utente è in chiamata? Come lo rilevo?

risposta

28

UIApplicationDelegate ha questi due metodi.

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame; // in screen coordinates 
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame; 

E ci sono Notifications troppo.

UIApplicationWillChangeStatusBarFrameNotification 
UIApplicationDidChangeStatusBarFrameNotification 

Ma non sono pubblicate sul lancio della app, quindi non lo consiglio.

Il simulatore ha uno strumento utile per testarlo.

Hardware->Toggle In-Call Status Bar 

Per implementare, è necessario implementare questi metodi sul file AppDelegate.m. Saranno chiamati quando la barra di stato cambia altezza. Uno di questi è chiamato prima e l'altro dopo il cambiamento.

Supponendo che si desidera che il proprio ViewController venga avvisato quando si verifica la modifica, un'opzione è l'invio di notifiche. Ti piace questa

In primo luogo, Aggiungi questa proprietà su AppDelegate.h

@property (assign, nonatomic) CGRect currentStatusBarFrame; 

quindi, implementare willChangeStatusBarFrame su AppDelegate.m

- (void) application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame 
{ 
    self.currentStatusBarFrame = newStatusBarFrame; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Status Bar Frame Change" 
                 object:self 
                 userInfo:@{@"current status bar frame": [NSValue valueWithCGRect:newStatusBarFrame]}]; 

} 

E abbiamo finito con la base della nostra Status Bar Frame Checker. La parte successiva viene implementata su qualsiasi ViewController che deve conoscere la cornice della barra di stato.

Ogni volta che si desidera ottenere il telaio barra di stato, si fa in questo modo

[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame] 

E per una notifica quando cambia, aggiungere questo al ViewDidLoad metodo.

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(statusBarFrameChanged:) 
              name:@"Status Bar Frame Change" 
              object:[[UIApplication sharedApplication] delegate]]; 

E implementare questo metodo

- (void) statusBarFrameChanged:(NSNotification*)notification 
{ 
    CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue]; 
    NSLog(@"new height %f", CGRectGetHeight(newFrame)); 
    // Here you do whatever you wanna do with the new height 
} 
+0

La risposta giusta non è quella di fare il layout con i numeri hard-coded, in primo luogo e utilizzare il layout automatico, Ridimensionamento automatico maschere, o regolare basato sulla vostra dimensione attuale in layoutSubviews invece di monitorare effettivamente lo stato della barra di stato. (Ad esempio, il codice dell'OP non funzionerà su display da 3,5 "per lo stesso motivo.) –

+0

Qualche idea su come farlo in orizzontale? In paesaggio, la barra di stato non cambia altezza in una chiamata, quindi il fotogramma è cambiato le notifiche non vengono mai chiamate. – MusiGenesis

+1

Penso che tu voglia cambiare "Cambio cornice barra di stato" con UIApplicationWillChangeStatusBarFrameNotification – kevinl

Problemi correlati