Manejando la aplicación: willChangeStatusBarFrame:

En mi aplicación, manejo el cambio del marco de la barra de estado simplemente escalando toda la window para ajustarlo en el espacio de pantalla restante:

- (void)application:(UIApplication *)application willChangeStatusBarFrame: (CGRect)newStatusBarFrame { UIView* window = [UIApplication shanetworkingApplication].keyWindow; [UIView animateWithDuration:1 / 3.f animations:^{ CGFloat heightDifference = newStatusBarFrame.size.height - kWXDefaultStatusBarHeight; [window setTransform:CGAffineTransformMakeScale(1.f, heightScaleForCallStatusBar())]; [window setFrame:CGRectOffset(window.frame, 0, heightDifference - kWXDefaultStatusBarHeight / 2)]; }]; } 

Esto funciona, pero si la window se networkinguce a escala durante una llamada y presento un controller de vista con -presentViewController:animated:completion: el nuevo controller no usa el sistema de coorderadas escalado, usa un escalado y el La interfaz de usuario se rompe. ¿Alguna idea de cómo get la .transform la window para transferirla a los nuevos controlleres de vista que se presentan?

Alternativamente, ¿hay otra forma de manejar la barra de estado de la llamada sin tener que volver a organizar todos mis elementos de la interfaz de usuario?

Cada controller de vista tendrá el marco de su vista establecido en el espacio disponible. La forma más sencilla de manejar esto es asegurándose de que las properties de resorte y puntas de su vista o las properties de reproducción automática permiten la compression o la expansión de la vista. Con el mundo de iPhone ahora incluyendo múltiples tamaños de pantalla, esta es una buena práctica general.

Sin embargo, si está decidido a usar una transformación en su vista para manejar el cambio de tamaño, puede implementar -viewWillLayoutSubviews en sus controlleres de vista (probablemente en una class base común) para establecer una transformación en la vista raíz del controller de vista.

Editar :

En la investigación, parece que los cambios en la barra de estado de llamada no causan que se -viewWillLayoutSubviews a -viewWillLayoutSubviews . Sin embargo, el siguiente código (en una class base de controller de vista común) está funcionando para mí:

 - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusFrameChanged:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; } - (void)viewDidUnload { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; [super viewDidUnload]; } - (void)statusFrameChanged:(NSNotification*)note { CGRect statusBarFrame = [note.userInfo[UIApplicationStatusBarFrameUserInfoKey] CGRectValue]; CGFloat statusHeight = statusBarFrame.size.height; UIScreen *screen = [UIScreen mainScreen]; CGRect viewRect = screen.bounds; viewRect.size.height -= statusHeight; viewRect.origin.y = statusHeight; self.view.frame = viewRect; [self.view setNeedsLayout]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; CGRect baseFrame = self.view.frame; // 548.0 is the full height of the view. Update as necessary. CGFloat scale = self.view.frame.size.height / 548.0; [self.view setTransform:CGAffineTransformMakeScale(1.0, scale)]; self.view.frame = baseFrame; }