Diseño automático y barra de estado de llamada

Me gustaría preguntar sobre el layout automático y la barra de estado de llamada. Aquí hay un escenario simple que demuestra mi problema:

  1. Crear proyecto con "Usar guiones charts" habilitado
  2. Agregue "Controlador de vista" y habilite su "Controlador de vista inicial"
  3. Establezca el color de background de la vista del controller en rojo
  4. Agregue "Vista de tabla" en la vista del controller

La vista de tabla debe tener 4 restricciones de layout (principal, superior, posterior, inferior) a Superview con constante establecido en 0.

Ahora cuando ejecuto esta aplicación en Simulator y presiono ⌘ + T , puedo ver el background rojo mientras la barra de estado de la llamada se activa. ¿Es posible deshacerte de este problema?

(Utilizando una respuesta en lugar de un comentario debido a la falta de reputación, lo siento).

Me encontré con este problema y estaba probando, por ejemplo, la solución señalada anteriormente: no funcionó para mí.

Así que creé un repository con código de ejemplo para exponer el problema del póster original. Existen aplicaciones de ejemplo para estos escenarios:

  1. el controller de vista personalizado es el controller de vista raíz de la window,
  2. el Custom View Controller es hijo de un UINavigationController que es el controller de la vista raíz de la window,
  3. el Custom View Controller es hijo de un UITabBarController que es el controller de la vista raíz de la window y
  4. el Custom View Controller es hijo de un UINavigationController que es hijo de un UITabBarController que es el controller de la vista raíz de la window.

Resultó que la solución de CEarwood realmente funciona … cuando el controller de vista personalizado es hijo de un UINavigationController (casos 2 y 4). Sin embargo, no funciona en los casos 1 y 3.

Espero que esta información sea útil.

Para una respuesta puramente Auto Layout puede get una reference a la restricción inferior y ajustar su constante cuando se recibe UIApplicationWillChangeStatusBarFrameNotification y volver a 0 cuando se recibe la notificación DidChange. Aquí está la testing VC que utilicé:

@interface CEViewController () @property (nonatomic, strong) IBOutlet NSLayoutConstraint *bottomConstraint; @end @implementation CEViewController - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:) name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameDidChange:) name:UIApplicationDidChangeStatusBarFrameNotification object:nil]; } - (void)statusBarFrameWillChange:(NSNotification *)note { NSValue *newFrameValue = [note userInfo][UIApplicationStatusBarFrameUserInfoKey]; self.bottomConstraint.constant = newFrameValue.CGRectValue.size.height; [self.view setNeedsLayout]; } - (void)statusBarFrameDidChange:(NSNotification *)note { self.bottomConstraint.constant = 0; [self.view setNeedsLayout]; } @end 

Este es un efecto del cambio de tamaño de la pantalla.

Cuando aparece la barra de estado de llamada, la vista cambia de tamaño al tamaño que debería tener con la barra de estado de llamada activa y luego se mueve hacia abajo cuando la barra de estado cambia de tamaño.

Por un breve momento, la vista debajo de la vista de la tabla está visible. Lo que puede hacer es agregar una vista debajo de la vista de la tabla que se extiende hacia abajo fuera de la pantalla para cubrir el color de background.

Otro enfoque es con su AppDelegate , implementar:

 -application:willChangeStatusBarFrame: 

y cambie el tamaño de la vista de tabla para cubrir el bit que se expone. Luego, cuando – application:didChangeStatusBarFrame: se llama, vuelva a cambiar el tamaño al tamaño original.