UIApplicationDelegate
ma te dwie metody.
Są też Notifications
.
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
, ale nie zostały one opublikowane podczas uruchamiania aplikacji, więc nie polecam go.
Symulator ma przydatne narzędzie do testowania tego.
Hardware->Toggle In-Call Status Bar
Aby zaimplementować, musisz wdrożyć te metody na swoim pliku AppDelegate.m
. Będą wywoływane, gdy pasek stanu zmieni jego wysokość. Jeden z nich został wywołany wcześniej, a drugi po zmianie.
Zakładając, że chcesz, aby Twój ViewController
był powiadamiany o zmianie, jedną z opcji jest wysyłanie powiadomień. Podoba Ci się to
Najpierw dodaj tę właściwość na AppDelegate.h
@property (assign, nonatomic) CGRect currentStatusBarFrame;
następnie wdrożyć willChangeStatusBarFrame
na AppDelegate.m
- (void) application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame
{
self.currentStatusBarFrame = newStatusBarFrame;
[[NSNotificationCenter defaultCenter] postNotificationName:@"Status Bar Frame Change"
object:self
userInfo:@{@"current status bar frame": [NSValue valueWithCGRect:newStatusBarFrame]}];
}
I skończymy z podstawą naszego Status Bar Frame Checker
. Następna część implementujesz na dowolnym ViewController
, który musi znać ramkę paska stanu.
każdym razem, gdy chcesz uzyskać ramkę paska stanu, jak to zrobić tak
[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame]
i być powiadomiony, gdy to się nie zmieni, to dodać do ViewDidLoad
metody.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameChanged:)
name:@"Status Bar Frame Change"
object:[[UIApplication sharedApplication] delegate]];
i wdrożenie tej metody
- (void) statusBarFrameChanged:(NSNotification*)notification
{
CGRect newFrame = [[notification.userInfo objectForKey:@"current status bar frame"] CGRectValue];
NSLog(@"new height %f", CGRectGetHeight(newFrame));
// Here you do whatever you wanna do with the new height
}
Prawidłowa odpowiedź nie jest do zrobienia układ z numerami zakodowane w pierwszej kolejności i korzystania układ Auto, Auto rozmiaru maski, lub regulacji na podstawie bieżącej wielkości w layoutSubviews zamiast w rzeczywistości monitorować stan paska stanu. (Na przykład kod OP nie będzie działać na ekranach 3,5 "z tego samego powodu.) –
Wszelkie przemyślenia na temat tego, jak to zrobić w krajobrazie. W krajobrazie pasek stanu nie zmienia wysokości w połączeniu, więc ramka zmieniła się Powiadomienia nigdy nie są wywoływane – MusiGenesis
Myślę, że chcesz zmienić "Zmiana stanu paska stanu" za pomocą UIApplicationWillChangeStatusBarFrameNotification – kevinl