Come ottenere a livello di codice l'altezza della barra di stato iOS


277

So che attualmente la barra di stato (con l'ora, la batteria e la connessione di rete) nella parte superiore dell'iPhone / iPad è di 20 pixel per schermi non retina e 40 pixel per schermi retina, ma a prova di futuro la mia app vorrei per poterlo determinare senza valori di codifica rigidi. È possibile capire l'altezza della barra di stato a livello di codice?

Risposte:


506

[UIApplication sharedApplication].statusBarFrame.size.height. Ma poiché tutte le dimensioni sono in punti, non in pixel, l'altezza della barra di stato è sempre uguale a 20.

Aggiornare. Vedendo questa risposta considerata utile, dovrei elaborare.

L'altezza della barra di stato è, in effetti, uguale a 20.0f punti tranne i seguenti casi:

  • la barra di stato è stata nascosta con il setStatusBarHidden:withAnimation:metodo e la sua altezza è pari a 0,0f punti;
  • come indicato qui da @Anton, durante una chiamata in arrivo al di fuori dell'applicazione Telefono o durante la barra di stato della sessione di registrazione del suono l'altezza è pari a 40,0 f punti.

C'è anche un caso di barra di stato che influenza l'altezza della vista. Normalmente, l'altezza della vista è uguale alla dimensione dello schermo per l'orientamento dato meno l'altezza della barra di stato. Tuttavia, se animi la barra di stato (mostra o nascondi) dopo che la vista è stata mostrata, la barra di stato cambierà il suo riquadro, ma la vista no , dovrai ridimensionare manualmente la vista dopo l'animazione della barra di stato (o durante l'animazione dal l'altezza della barra di stato viene impostata sul valore finale all'inizio dell'animazione).

Aggiornamento 2. C'è anche un caso di orientamento dell'interfaccia utente. Barra di stato non rispetta il valore di orientamento, in tal modo valore di altezza barra di stato per il ritratto modalità è [UIApplication sharedApplication].statusBarFrame.size.height(sì, l'orientamento di default è sempre ritratto, non importa quello che dice la tua applicazione info.plist), per il paesaggio - [UIApplication sharedApplication].statusBarFrame.size.width. Per determinare l'orientamento corrente dell'interfaccia utente quando non è disponibile UIViewControllere self.interfaceOrientationnon è disponibile, utilizzare [UIApplication sharedApplication].statusBarOrientation.

Aggiornamento per iOS7. Anche se lo stile visivo della barra di stato è cambiato, è ancora lì, la sua cornice si comporta sempre allo stesso modo. L'unica trovo interessante di barra di stato ho ottenuto - I Condividi: il vostro UINavigationBar's piastrelle di fondo sarà inoltre affiancata a mosaico per la barra di stato, in modo da poter ottenere alcuni effetti interessanti di design o semplicemente colorare la vostra barra di stato. Anche questo non influirà in alcun modo sull'altezza della barra di stato.

Anche lo sfondo piastrellato della barra di navigazione è piastrellato nella barra di stato


6
Questo metodo produce 1024 (iOS7)
Marc,

1
@MarcMosby, vedi il mio aggiornamento. Ricordato questo problema, grazie a te.
Kyr Dunenkoff,

2
Sì, come ha indicato Marc su iOS7, produce 1024 a volte e 20 a volte. Quindi questo non è più un modo infallibile per determinare l'altezza. Dubito che ciò sia dovuto alla natura trasparente della barra di stato su iOS 7. Potrebbe essere quello, prima passa a schermo intero e quindi si ridimensiona. Pertanto, se si eseguono query sulle app durante questa transizione, è possibile che si ottenga un valore errato. Potrebbe essere il richiamo di questo metodo con un ritardo potrebbe aiutare su iOS 7.
Deepak GM

1
C'è un caso in cui l'altezza della barra di stato può essere zero. Se supportInterfaceOrientations () restituisce UIInterfaceOrientation (risultato errato ma nessun errore del compilatore) invece di UIInterfaceOrientationMask e viene presentato e ignorato un viewcontroller, l'altezza della barra di stato diventerà zero.
Cymric il

5
Anche su iPhone X la barra di stato sarà più alta.
prima del
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.