iphone - teclado - ¿Cambiar el tamaño de la barra de estado durante la llamada?
como poner porcentaje de bateria en iphone 7 (11)
¿Qué quiere decir cuando dice que ''las propiedades de cambio de tamaño no están habilitadas para la UIView raíz''?
La barra de estado durante la llamada no tiene ninguna designación especial en particular, y no creo que haya ninguna API o notificación a su alrededor. En su lugar, sus vistas simplemente deben configurarse para autorizar correctamente.
Intente crear una nueva aplicación basada en la navegación en Xcode y estudie las configuraciones de tamaño automático en la vista de tabla en RootViewController.xib. Con suerte, verá un delta entre lo que establece Apple y lo que ha establecido en su proyecto.
¿Cómo puedo cambiar el tamaño de mi vista en respuesta a la barra de estado de la llamada desde mi plumilla?
Pensé que solo estaría configurando 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 la documentación, excepto cuando se trata del comando de menú del simulador).
Es posible que una vista no cambie de tamaño automáticamente con los cambios en el tamaño de la barra de estado si no tiene configurado un controlador de vista raíz. Originalmente tuve esto en mi delegado de aplicaciones, y mi aplicación funcionó correctamente en todos los aspectos excepto que no cambiaría de 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
Está buscando - [UIApplication statusBarFrame] y, en su UIApplicationDelegate, debe implementar este método delegado para recibir una notificación cuando cambie el marco de la barra de estado:
- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame
Estaba teniendo el mismo problema. Lo que hice fue esto.
- Abre el archivo xib en IB
- Todos los elementos de la interfaz se adjuntan de forma predeterminada para moverse junto con la parte superior y se muestran en la propiedad ''Automatización'' en el ''Inspector de tamaño''. Entonces, 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 haga el enlace de la parte inferior. Deja todos los demás como es.
- ¡¡¡Problema resuelto!!!
Espero haber sido claro.
La notificación para el marco de cambio de 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 manejador:
- (void)statusBarFrameWillChange:(NSNotification*)notification { // respond to changes }
Incluso con la configuración de reproducción automática correcta, es posible que deba responder a los cambios. Por ejemplo, una vista de tabla que calcula la altura de la 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.
La solución es asegurarte de que has hecho tu clave de ventana:
[window makeKeyAndVisible];
Si no hace eso, la subvista no se redimensiona automáticamente, pero no hay otros síntomas que yo sepa.
Ninguna de las soluciones publicadas antes 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 de contenedor diferentes dentro de mi vista.
La vista del contenedor de la parte inferior (en la lista) era un UITableView
, que no se desplazaba correctamente a la parte inferior de la tabla. La razón fue que el desplazamiento de la barra de estado durante la llamada estaba causando que el origen (esquina superior izquierda) del 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 de Autoresizing correctamente. En la captura de pantalla a continuación, son las flechas verticales en el medio del cuadro de Autoresizing .
Para vistas como UITableView, normalmente necesitará cambiar la altura de la celda de la tabla, y no hay otra manera de hacerlo excepto para implementar la aplicación: didChangeStatusBarFrame:. Pero no tiene importancia, y puede establecer el alto de fila en valores no enteros si lo necesita.
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 al usarla puede actualizar sus marcos en consecuencia.
esto funciona perfectamente para mí cuando mi aplicación se ejecuta en segundo plano y presiono comando + T. En mi escenario, el controlador raíz es mi controlador de barra de pestañas 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;
}];
}
iOS invocará el método viewWillLayoutSubviews de viewController cuando 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];
}