Cambiar el tamaño de la barra de estado durante la llamada?

¿Cómo puedo hacer que mi vista cambie de tamaño en respuesta a la barra de estado de mi pluma?

Pensé que solo sería establecer las propiedades de cambio de tamaño, pero no están habilitadas para la UIView raíz.

(Creo que mi principal problema aquí es que no sé cómo se llama nada de esto; no puedo encontrar ninguna referencia a la barra de estado durante la llamada en ninguna de las documentaciones, excepto cuando se trata del comando del menú del simulador).

¿A qué te refieres cuando dices que “las propiedades de cambio de tamaño no están habilitadas para la UIView raíz”?

La barra de estado de la llamada entrante no tiene ninguna designación especial particular, y no creo que haya ninguna API o notificaciones a su alrededor. En cambio, sus puntos de vista simplemente deben configurarse para autoevaluación correctamente.

Intente crear una nueva aplicación basada en navegación en Xcode y estudie las configuraciones de autoresize en la vista de tabla en RootViewController.xib. Es de esperar que veas un delta entre lo que Apple estableció y lo que configuraste en tu proyecto.

iOS invocará el método viewWillLayoutSubviews de viewController cada vez que haya un cambio en la barra de estado. Puede anular eso y ajustar sus subvistas según los nuevos límites.

 - (void)viewWillLayoutSubviews { // Your adjustments accd to // viewController.bounds [super viewWillLayoutSubviews]; } 

Está buscando – [UIApplication statusBarFrame] y, en su UIApplicationDelegate, debe implementar este método delegado para recibir notificaciones cuando cambie el marco de la barra de estado:

 - (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame 

Es posible que una vista no cambie de tamaño automáticamente si el tamaño de la barra de estado cambia si no tiene un controlador de vista raíz configurado. Originalmente tenía esto en mi delegado de la aplicación, y mi aplicación funcionó correctamente en todos los aspectos, excepto que no cambiaría el tamaño correctamente durante las llamadas telefónicas.

 [self.window addSubview:rootController.view]; 

Cambié la línea anterior a esto, y ahora mi aplicación cambia de tamaño automáticamente durante las llamadas.

 [self.window setRootViewController:rootController]; 

Descubrí esta solución después de ver esto en el registro e investigar la causa.

 Application windows are expected to have a root view controller at the end of application launch 

esto funciona perfectamente para mí cuando mi aplicación se ejecuta en segundo plano y presiono el comando + T. En mi caso, el controlador raíz es mi controlador de barra de tabs y estoy reajustando mi controlador de navegación dentro de cada pestaña.

 - (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{ [UIView animateWithDuration:0.35 animations:^{ CGRect windowFrame = ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame; if (newStatusBarFrame.size.height > 20) { windowFrame.origin.y = newStatusBarFrame.size.height - 20 ;// old status bar frame is 20 } else{ windowFrame.origin.y = 0.0; } ((UINavigationController *)((UITabBarController *)self.window.rootViewController).viewControllers[0]).view.frame = windowFrame; }]; 

}

Para vistas como UITableView, normalmente necesitará cambiar la altura de la celda de la tabla, y no hay otra manera de hacerlo excepto implementar la aplicación: didChangeStatusBarFrame:. Pero no es gran cosa, y puede establecer la altura de la fila en valores no enteros, si es necesario.

La notificación para el marco cambiante de la barra de estado es

UIApplicationWillChangeStatusBarFrameNotification

Registrarse como observador:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

Luego responde al cambio en tu controlador:

- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }

Incluso con la configuración de la configuración automática correctamente, es posible que deba responder a los cambios. Por ejemplo, una vista de tabla que calcule su altura de celda en función del espacio dado en la pantalla podría necesitar reloadData a reloadData después de que la barra de estado haya cambiado.

Documentación

Estaba teniendo el mismo problema. Lo que hice fue esto.

  1. Abra el archivo xib en IB
  2. Todos los elementos de la interfaz están adjuntos por defecto para moverse junto con la parte superior y se muestran en la propiedad ‘Autosizing’ en ‘Size Inspector’. Por lo tanto, para los elementos de la interfaz de usuario en la parte inferior de la pantalla, elimine el enlace de la parte superior y, en su lugar, establezca el enlace desde la parte inferior. Deja todos los demás como están.
  3. ¡¡¡Problema resuelto!!!

Espero haber sido claro.

Tendrá que actualizar las vistas manualmente si está configurando sus marcos de vista programáticamente

  -(void) viewDidAppear:(BOOL)animated { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarFrameWillChange:)name:UIApplicationWillChangeStatusBarFrameNotification object:nil]; } - (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes NSLog(@"STATUS BAR UPDATED"); NSDictionary *statusBarDetail = [notification userInfo]; NSValue *animationCurve = statusBarDetail[UIApplicationStatusBarFrameUserInfoKey]; CGRect statusBarFrameBeginRect = [animationCurve CGRectValue]; int statusBarHeight = (UIInterfaceOrientationIsPortrait([[UIApplication sharedApplication]statusBarOrientation])) ? statusBarFrameBeginRect.size.height : statusBarFrameBeginRect.size.width; NSLog(@"status bar height %d", statusBarHeight); } -(void) viewDidDisappear:(BOOL)animated { [[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationBackgroundRefreshStatusDidChangeNotification object:nil]; } 

Esto le da la nueva altura de la barra de estado y con esto puede actualizar sus marcos en consecuencia.

La solución es garantizar que haya creado su clave de ventana:

 [window makeKeyAndVisible]; 

Si no lo haces, la subvista no se redimensionará automáticamente, pero, hasta donde yo sé, no hay otros síntomas.

Ninguna de las soluciones publicadas anteriormente funcionó para mí. Lo que funcionó para mí fue que no tenía mis restricciones configuradas correctamente para mis puntos de vista. En mi situación, tenía dos vistas diferentes de contenedor desde mi punto de vista.

Vista de la escena en el guión gráfico.

La vista de contenedor inferior (en la lista) era una UITableView , que no se desplazaba correctamente hacia la parte inferior de la tabla. El motivo era que el desplazamiento de la barra de estado de la llamada UITableView causaba que el origen (esquina superior izquierda) de UITableView cambiara, pero el tamaño seguiría siendo el mismo. ¡Esto significaba que la parte inferior de la mesa estaba fuera de la pantalla!

La solución fue establecer correctamente la restricción de altura Autoresizing correctamente. En la captura de pantalla siguiente, son las flechas verticales en el medio del cuadro Autoresizing .

enter image description here