2010-10-08 18 views
57

Potrzebuję zmienić rozmiar niektórych elementów w stosunku do wysokości paska stanu iPhone'a. Wiem, że pasek stanu ma zwykle 20 punktów, ale nie jest tak, gdy jest w trybie tetheringu. Zostaje podwojona do 40. Jaki jest właściwy sposób określenia wysokości? Próbowałem już uzyskać pewność, ale daje mi 20 x 480 w krajobrazie, który jest poprawny, ale daje mi to 320 x 40 w pionie. Dlaczego nie daje mi czegoś przeciwnego (40 x 320)?Uzyskaj wysokość paska stanu iPhone'a

+0

W jaki sposób pasek stanu może mieć rozmiar 40 pikseli? – Andy

+0

@Andy, gdy aktywne jest tethering, wysokość paska stanu zwiększa się do 40px –

+0

Lub gdy przychodzi połączenie – SwiftMatt

Odpowiedz

78

StatusBarFrame zwraca ramkę we współrzędnych ekranu. Wierzę, że poprawny sposób, aby uzyskać to, co odpowiada w koordynuje widok jest wykonanie następujących czynności:

- (CGRect)statusBarFrameViewRect:(UIView*)view 
{ 
    CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; 

    CGRect statusBarWindowRect = [view.window convertRect:statusBarFrame fromWindow: nil]; 

    CGRect statusBarViewRect = [view convertRect:statusBarWindowRect fromView: nil]; 

    return statusBarViewRect; 
} 

Teraz w większości przypadków okno wykorzystuje te same współrzędne jak ekran, więc [UIWindow convertRect:fromWindow:] niczego nie zmienia, ale w przypadku, gdyby były inne, ta metoda powinna postąpić właściwie.

+2

Wywołanie tej metody w '- [UIViewController viewWillAppear:]' nie działa. Dwie kwestie: 1. Okno widoku ma wówczas postać 'nil'. 2. Nawet gdy poprzedzałem wywołanie '- [UIWindow convertRect: fromWindow:]' z 'if (view.window)', kiedy wróciłem do kontrolera widoku w trybie poziomym, statusBarFrame miał zmienioną szerokość i wysokość, a wywołanie '- [UIView convertRect: fromView:]' nie przełączyło ich poprawnie. – ma11hew28

+0

@MattDiPasquale Dlaczego nie nazwać go w 'viewDidAppear:' zamiast? – ThomasW

+1

Ponieważ dostosowuję 'self.collectionView.contentInset' na podstawie' [UIApplication sharedApplication] .statusBarFrame'. Jeśli dostosuję go po wyświetleniu widoku, zobaczysz, jak skacze. Muszę to zmienić, zanim pojawi się widok. – ma11hew28

13

zrobiłaś to tak:

CGRect rect; 

rect = [[UIApplication sharedApplication] statusBarFrame]; 
NSLog(@"Statusbar frame: %1.0f, %1.0f, %1.0f, %1.0f", rect.origin.x, rect.origin.y, rect.size.width, rect.size.height); 
+0

Tak, jestem. Wspomniałem o tym w moim początkowym pytaniu. –

+19

Możesz także użyć NSStringFromCGRect: 'NSLog (@" Pasek stanu paska:% @ ", NSStringFromCGRect (rect));' – progrmr

+4

Jak to wszystko jest połączone z problemem ??? – Andy

5

Można sprawdzić, które jest mniejszą z dwóch wartości, które będą prawdziwą wysokość.

+0

Dzięki! [Zaimplementowałem ten pomysł] (http://stackoverflow.com/a/16598350/242933). Wspaniale! – ma11hew28

5

Ta metoda służy do orientacji pionowej w orientacji pionowej.

-(float) statusBarHeight 
{ 
    CGSize statusBarSize = [[UIApplication sharedApplication] statusBarFrame].size; 
    return MIN(statusBarSize.width, statusBarSize.height); 
} 

// example call 
float statusBarHeight = [self statusBarHeight]; 
+0

Czy mógłbyś podać więcej szczegółów na temat swojego rozwiązania, dzięki! –

+0

Można tego użyć w implementacji ViewController. Na przykład w metodzie "viewDidLoad". –

5

EDIT IOS 11 sposób wypracować gdzie umieścić górną część zawartości widzenia jest UIView na safeAreaLayoutGuide Zobacz UIView Documentation.

ODRADZANE ODPOWIEDŹ Jeśli kierujesz iOS 7+, Dokumentacja UIViewController przypomina, że ​​topLayoutGuide własność viewController daje Ci dno pasku stanu lub dno pasku nawigacyjnym, jeśli jest to również widoczne. To może być użyteczne i jest z pewnością mniej hackowe niż wiele wcześniejszych rozwiązań.

3

Swift 2:

let statusBarHeight = UIApplication.sharedApplication().statusBarFrame.height 

Swift Swift 3 lub 4:

let statusBarHeight = UIApplication.shared.statusBarFrame.height 

Wskazówka: Nie zapomnij wstrzyknąć UIApplication.shared nie wystarczy użyć singleton w kodzie.

+1

Dlaczego nie chciałbym używać singletonu? –