2010-10-16 10 views
14

Sto creando un'app per iphone con pochi elementi all'interno del controller (ad esempio tab bar, uiview, uitoolbar, ecc.). Tutto funziona bene finché non ho riscontrato questo problema. Mentre la mia applicazione è stata avviata, ho ricevuto una chiamata e mostra la "Call Status Bar" che ha rovinato l'interfaccia utente. Alcuni elementi sono premuti perché la "Barra di stato delle chiamate" occupa spazio in alto.Iphone- Come ridimensionare la visualizzazione quando viene attivata la barra di stato della chiamata?

Qualcuno qui ha un'idea su come risolvere questo problema? Sono nuovo nello sviluppo di app per iPhone.

La tua risposta è molto apprezzato ...

migliori saluti,

risposta

12

Si dovrebbe mettere questa funzione AppDelegate, questo innescherà quando la barra di stato cambiamento

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:@"trigger" forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict]; 
} 

Questo Codice invierà notifica con il nome di "trigger"

Posizionare un codice al controller della vista (ad esempio: viewDidLoad, ecc ..) questo ascoltare se ci sono notifiche di inviare con un nome "trigger"

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dataReceived:) 
              name:@"trigger" 
              object:nil]; 

e creare una funzione DataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification { 
    NSDictionary *data = [notification userInfo]; 
    // do something with data 
} 

fare qualcosa in questa parte del codice, forse si cambia la struttura del vostro barra delle schede, cornice UIView, cornice barra degli strumenti

E in dealloc, inserire questo codice per rimuovere l'osservatore

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

Questo funziona per me ... Grazie –

+0

Vedere @ process255 per una risposta più corretta. Anche l'utilizzo di valori letterali stringa nudi per la pubblicazione/sottoscrizione di notifiche è una cattiva pratica (incline a errori e errori di battitura, è necessario definire in anticipo i nomi di notifica 'NSString * const'). –

+0

@dianz hai cambiato chiave e valore in dict. "trigger" dovrebbe essere la chiave. – Kof

3

Fondamentalmente quello che normalmente fare è cercare di impostare le bandiere AutoResize di tutti i vostri elementi dell'interfaccia utente nel costruttore di interfaccia in modo che quando la vista principale è "schiacciato" dalla barra di stato della chiamata, tutto sembrerà ancora ragionevole. È un po 'difficile spiegare come fare tutto questo in un unico messaggio, ma ti consiglio di creare una vista in IB, inserendo alcune sottoview, quindi ridimensionando la vista principale mentre giochi con le bandiere di autoresize per avere un'idea di come le bandiere lavoro. I flag di autoresize sono in Command-3 (ispettore dimensioni).

È inoltre possibile impostare wantsFullScreenLayout nel controller della vista principale su SÌ per fare in modo che la vista occupi l'intero schermo, inclusa l'area sotto la barra di stato, ma è necessario accertarsi di non posizionare nulla sotto la barra di stato e la barra di stato della chiamata si sovrappongono a qualcosa di troppo vicino, ovviamente.

+0

E per l'ambiente con vincoli iOS7/AutoLayout? –

21

La solutio di dianz funziona perfettamente ma è un po 'ridondante se si è interessati solo a conoscere la notifica all'interno di uno specifico controller di visualizzazione.

Dopo che il metodo delegato application:didChangeStatusBarFrame: viene chiamato nel Delegato applicazione UIApplicationDidChangeStatusBarFrameNotification viene inviato tramite [NSNotificationCenter defaultCenter].

Invece di utilizzare il metodo delegato application:didChangeStatusBarFrame: per ripubblicare semplicemente una notifica personalizzata, è possibile aggiungere un osservatore a UIApplicationDidChangeStatusBarFrameNotification direttamente dal controller di visualizzazione.

In MyCustomViewController si dovrebbe aggiungere qualcosa di simile a questo:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

Ora non è più necessario per definire il metodo application:didChangeStatusBarFrame: delegato in AppDelegate (a meno che non si ha intenzione di fare qualcosa in AppDelegate quando la barra di stato cambia dimensione).

Come con l'esempio di dianz è necessario rimuovere l'osservatore dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

Ottima risposta, tranne che per errore (in base alla domanda originale) utilizzato 'UIApplicationWillChangeStatusBarOrientationNotification' invece di' UIApplicationWillChangeStatusBarFrameNotification'. Se stai cercando di scoprire quando la barra di stato verde in chiamata appare o scompare, vuoi il secondo: 'UIApplicationWillChangeStatusBarFrameNotification'. –

+0

Veramente, grazie per l'aggiornamento! –

1

per me, ogni volta che la barra di stato viene ingrandita, - (void) viewWillLayoutSubviews è sempre chiamato. Questo è perfetto per me perché tutto il mio codice setFrame sottoconto è in questa funzione.

Problemi correlati