2013-05-16 6 views
8

Sono stato con il seguente codice per ottenere l'altezza della barra di stato:statusBarFrame.height torna 1.024,0 quando in Landscape (iPad)

[UIApplication sharedApplication].statusBarFrame.size.height

Questo funziona perfettamente in modalità ritratto e restituisce il valore atteso (20.0), ma quando l'applicazione è in Landscape, ottengo il valore inaspettato di 1024.0 !!

Qualcuno è in grado di far luce su questo per me?

iOS versione 6.1.3

versione XCode 4.6.2

risposta

10

Potrebbe essere necessario utilizzare [UIApplication sharedApplication].statusBarFrame.size.width in Orientamento orizzontale. Come [[UIScreen mainScreen] applicationFrame] fornisce valori commutati su Orientamento orizzontale

+0

Abbiamo bisogno dell'altezza di 'come è importante l'orientamento, poiché' height' è lo stesso? –

+2

Ciao, scusa ho appena visto il commento ... non so cosa intendi quando dici "poiché l'altezza è la stessa". L'orientamento è importante, perché lo statusBarFrame utilizza la cornice all'interno delle coordinate dello schermo. Sul ritratto, l'altezza ti darà 20 ma sul paesaggio è la larghezza che dà il valore che @llie sta cercando. –

+0

l'altezza della barra di stato è uguale in entrambi gli orientamenti. Cambia solo la larghezza –

-1

Pulire costruire il codice e controllare se orientationChange metodi vengono chiamati. Specificare anche la versione per iOS

+0

Ho già provato un Clean Build e i metodi orientationChange ottengono definitivamente chiamato. Ho modificato il post originale per mostrare la versione iOS (6.1.3) – Ollie

+0

@Ollie: Quindi prova a uscire dal riavvio 'Xcode' o costruisci con una versione precedente. –

+0

Non si trattava della versione di Xcode o di una build pulita. I sintomi erano presenti anche nei miei altri progetti e nei miei colleghi. Prova tu stesso. Tamara Bernad ha la soluzione corretta – Ollie

4

Questo è completamente corretto. Lo statusBarFrame è nelle coordinate dello schermo. È necessario utilizzare statusBarOrientation per verificare se è necessario cambiare le coordinate.

+0

Questa risposta è corretta, e l'ho usata in concomitanza con la risposta di Tamara Bernad per ottenere ciò di cui avevo bisogno. Molte grazie – Ollie

1

A che punto dell'applicazione ottieni questo? Se è al primo avvio,, controllare l'orientamento dei file .xib nel progetto. Se sono in verticale, anche se l'app viene avviata in orizzontale, non ha avuto il tempo di determinare l'orientamento e utilizza le dimensioni del file .xib da cui sta creando la vista dei controller di visualizzazione in primo piano.

In iOS 6 rilevazione movimentazione e l'orientamento di rotazione cambiato significativamente da iOS 5 ed inferiore, io beleive che non è più possibile invocare l'orientamento della barra di stato per questi valori.

this may help

+0

Questa è una buona spiegazione del perché la risposta di Tamara funzioni. –

13

Utilizzare questo se si vuole dimenticare l'orientamento o le coordinate problemi connessi:

float statusBarHeight = MIN([UIApplication sharedApplication].statusBarFrame.size.height, [UIApplication sharedApplication].statusBarFrame.size.width); 
1

Non è necessario controllare per l'orientamento, basta utilizzare il metodo conveniente per UIView conversione del frame:

CGRect statusBarFrame = [self.view convertRect:[[UIApplication sharedApplication] statusBarFrame] fromView:self.view.window]; 
+0

L'accesso all'altezza del frame restituito da questo frammento di codice ha lo stesso effetto delle altre risposte qui, ma descrive cosa sta accadendo in modo molto più chiaro. +1 –