2013-05-16 11 views
8

Używam następujący kod, aby uzyskać wysokość paska stanu:statusBarFrame.height zwraca 1024,0 gdy w Krajobrazowego (iPad)

[UIApplication sharedApplication].statusBarFrame.size.height

Działa to doskonale w trybie pionowym i zwraca wartość oczekiwaną (20.0), ale gdy aplikacja jest w pozycji poziomej, otrzymuję nieoczekiwaną wartość 1024.0 !!

Czy ktoś może rzucić na mnie jakiekolwiek światło?

wersja iOS 6.1.3

XCode wersja 4.6.2

Odpowiedz

10

Może być konieczne użycie opcji [UIApplication sharedApplication].statusBarFrame.size.width w orientacji poziomej. Taki sam jak [[UIScreen mainScreen] applicationFrame] daje przełączane wartości w orientacji poziomej

+0

Potrzebujemy "wysokości", jak ważne jest "orientacja", skoro "wysokość" jest taka sama? –

+2

Cześć, przepraszam, widziałem ten komentarz ... nie jestem pewien, co masz na myśli mówiąc "ponieważ wysokość jest taka sama". Orientacja ma znaczenie, ponieważ statusBarFrame używa ramki wewnątrz współrzędnych ekranu. W pionie wysokość da Ci 20, ale w krajobrazie jest to szerokość, która daje wartość, której szuka @Oie. –

+0

Wysokość paska stanu jest taka sama w obu orientacjach. Zmienia się tylko szerokość. –

-1

Clean Zbuduj swój kod i sprawdzić, czy orientationChange metody są wywoływane. Należy również podać wersję dla systemu iOS:

+0

Próbowałem już Clean Build, a metody orientationChange zdecydowanie nazywa. Zmodyfikowałem oryginalny wpis, aby wyświetlić wersję iOS (6.1.3) – Ollie

+0

@Ollie: Następnie spróbuj zakończyć ponowne uruchamianie 'Xcode' lub skompiluj z niższą wersją. –

+0

Nie był to przypadek wersji Xcode lub wymagający czystej kompilacji. Objawy występowały w moich innych projektach, a także w projektach moich kolegów. Spróbuj sam. Tamara Bernad ma poprawne rozwiązanie. – Ollie

4

To jest całkowicie poprawne. statusBarFrame ma współrzędne ekranu. Musisz użyć statusBarOrientation, aby sprawdzić, czy powinieneś zmienić współrzędne.

+0

Ta odpowiedź jest poprawna i użyłem jej w połączeniu z odpowiedzią Tamary Bernad, aby uzyskać to, czego potrzebowałem. Wielkie dzięki – Ollie

1

W jakim punkcie aplikacji masz to? Jeśli jest to pierwsze uruchomienie, sprawdź, w jakiej orientacji znajdują się pliki .xib w projekcie. Jeśli są one portretowe, to mimo tego, że aplikacja jest uruchomiona w krajobrazie, nie ma czasu na określenie orientacji i używa wymiarów pliku .xib, z którego tworzy widok z przodu kontrolerów widoku.

W iOS 6 wykrywanie obsługa obrót i orientacja zmienił znacząco od iOS 5 i niższy, ja wierz, że nie może już liczyć na orientacji paska stanu dla tych wartości.

this may help

+0

To jest dobre wyjaśnienie, dlaczego odpowiedź Tamary działa. –

13

Użyj tego jeśli chcesz zapomnieć o orientacji lub współrzędnych związanych z tym problemów:

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

Nie trzeba sprawdzić dla orientacji, wystarczy użyć wygodnej metody UIView dla konwersja ramki:

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

Uzyskanie dostępu do wysokości klatki zwróconej przez ten fragment powoduje to samo, co tutaj, ale opisuje to, co dzieje się znacznie wyraźniej. +1 –