UIApplicationDelegate
ha questi due metodi.
- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame; // in screen coordinates
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame;
E ci sono Notifications
troppo.
UIApplicationWillChangeStatusBarFrameNotification
UIApplicationDidChangeStatusBarFrameNotification
Ma non sono pubblicate sul lancio della app, quindi non lo consiglio.
Il simulatore ha uno strumento utile per testarlo.
Hardware->Toggle In-Call Status Bar
Per implementare, è necessario implementare questi metodi sul file AppDelegate.m
. Saranno chiamati quando la barra di stato cambia altezza. Uno di questi è chiamato prima e l'altro dopo il cambiamento.
Supponendo che si desidera che il proprio ViewController
venga avvisato quando si verifica la modifica, un'opzione è l'invio di notifiche. Ti piace questa
In primo luogo, Aggiungi questa proprietà su AppDelegate.h
@property (assign, nonatomic) CGRect currentStatusBarFrame;
quindi, implementare willChangeStatusBarFrame
su 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]}];
}
E abbiamo finito con la base della nostra Status Bar Frame Checker
. La parte successiva viene implementata su qualsiasi ViewController
che deve conoscere la cornice della barra di stato.
Ogni volta che si desidera ottenere il telaio barra di stato, si fa in questo modo
[(AppDelegate*)[[UIApplication sharedApplication] delegate] currentStatusBarFrame]
E per una notifica quando cambia, aggiungere questo al ViewDidLoad
metodo.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(statusBarFrameChanged:)
name:@"Status Bar Frame Change"
object:[[UIApplication sharedApplication] delegate]];
E implementare questo metodo
- (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
}
La risposta giusta non è quella di fare il layout con i numeri hard-coded, in primo luogo e utilizzare il layout automatico, Ridimensionamento automatico maschere, o regolare basato sulla vostra dimensione attuale in layoutSubviews invece di monitorare effettivamente lo stato della barra di stato. (Ad esempio, il codice dell'OP non funzionerà su display da 3,5 "per lo stesso motivo.) –
Qualche idea su come farlo in orizzontale? In paesaggio, la barra di stato non cambia altezza in una chiamata, quindi il fotogramma è cambiato le notifiche non vengono mai chiamate. – MusiGenesis
Penso che tu voglia cambiare "Cambio cornice barra di stato" con UIApplicationWillChangeStatusBarFrameNotification – kevinl