2009-07-11 22 views
22

¿Cómo puedo cambiar el tamaño de mi vista en respuesta a la barra de estado de mi pluma?Cambiar el tamaño de la barra de estado durante la llamada?

Me imaginé que solo establecería 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 de llamada en ninguna documentación, excepto cuando se trata del simulador . comando de menú)

Respuesta

6

Qué hacer ¿Quiere decir cuando dice que 'las propiedades de cambio de tamaño no están habilitadas para la raíz UIView'?

La barra de estado de la llamada entrante no tiene ninguna designación especial, 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 la navegación en Xcode y estudie la configuración 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.

+0

Probablemente estoy usando el término equivocado allí también. Básicamente, tengo un xib con un UIView. Seleccionando UIView y mirando las propiedades de cambio de tamaño, puedo hacer clic en las conexiones superior/inferior e izquierda/derecha, pero las horizontales y verticales en el centro no responden a los clics. –

+0

Creé una nueva UIView en el xib, y puedo manipularla. Parece ser algo malo con esa UIView en el xib. Experimentará un poco más y marcará esto como la solución si es así. –

+0

Sí, parece que algo está simplemente mal con esa UIView. Gracias. –

16

usted está buscando - [UIApplication statusBarFrame] y, en su UIApplicationDelegate, debe implementar este método delegado a ser notificado de cuando cambia el marco de la barra de estado:

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

Mike, ¿puedes aclarar: esto significa que debo cambiar manualmente el tamaño de los elementos en mis vistas en el código? ¡Jadear! –

+1

No veo por qué si las propiedades de conversión automática de su vista están configuradas correctamente. Pero sí, escribir código: qué horrible inconveniente. :-) –

+0

Marcado el otro aceptado porque señaló que lo que estaba tratando de hacer * debería * haber funcionado primero, pero muchas gracias. :) –

3

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 usted puede establecer la altura de la fila en valores no enteros si es necesario.

+0

Excepto esa aplicación: didChangeStatusBarFrame: y la notificación adjunta nunca se envía para un simple cambio de marco de estado. Pruébalo :-) –

+0

Me di cuenta de que cuando llegué a intentarlo. Entonces, ¿cómo manejamos el cambio en el tamaño de la pantalla? La interfaz de mi aplicación se desliza hacia abajo pero se oscurece parcialmente en el proceso. –

0

La solución es asegurarse de que haya realizado su clave ventana:

[window makeKeyAndVisible]; 

Si usted no hace que la subvista no consigue cambiar el tamaño automáticamente, pero no hay otros síntomas por lo que yo sé.

1

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

  1. Abrir el archivo en xib IB
  2. Todos los elementos de la interfaz por defecto se adjunta a moverse a lo largo de la parte superior y se muestra en la propiedad 'autosizing' en el 'Tamaño 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.

+0

Ahora mi vista no está visible si hago un enlace a la parte inferior. –

+0

No, no funciona para mí –

24

iOS invocará su viewController viewWillLayoutSubviews método 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]; 
} 
+0

Bueno, si modifica los límites aquí, 'viewWillLayoutSubviews' se volverá a llamar de forma recursiva. – Rivera

+0

extraño que se notifique viewController pero no se cambie de tamaño, se borra la altura, ¿hay alguna idea de por qué? –

+0

¡Genial! Puede actualizar su marco de contenido que podría usar como una constante en su UIViewController aquí también en self.view.bounds, por lo que el desplazamiento se propaga a lo largo de su jerarquía de vistas. –

7

Una vista puede no cambiar el tamaño automáticamente con cambios en el tamaño de la barra de estado 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]; 

me cambió la línea anterior a esto, y ahora mi aplicación redimensiona 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 
+0

¡Muchas gracias! Definitivamente ha resuelto mi problema. – GeRyCh

+0

¡OMG esto! ¡Esto resolvió mi problema, después de pasar horas ajustando las propiedades de pantalla completa de casi todo! – ArkReversed

7

esto funciona perfectamente para mí cuando mi aplicación se ejecuta en segundo plano y pulse Comando + T. En mi escenario, el controlador de la raíz es mi controlador de la 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; 
}]; 

}

+0

Esto no debería ser necesario; Creo que hay un error en las plantillas de Xcode. Lo arreglé borrando + recreando el controlador de vista. El nuevo responde de la manera que esperaba. –

+0

Lo arreglé, en mi caso había empujado un controlador de barra de pestañas dentro de un controlador de navegación, por lo que estaba causando los problemas. Ahora funciona a la perfección. Ahora el controlador de la barra de pestañas es mi controlador raíz y estoy reajustando la vista de mi controlador de navegación dentro del controlador de la barra de pestañas. – user1544494

+0

Gracias es trabajo para mí. Gracias :) – ilesh

0

Ninguna de las soluciones de aviso antes trabajó 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.

View of scene in storyboard.

La parte inferior (en la lista) vista recipiente fue un UITableView, que no se desplaza correctamente a la parte inferior de la tabla. El motivo era que el desplazamiento de la barra de estado de la llamada entrante causaba que el origen (esquina superior izquierda) del UITableView cambiara, pero el tamaño permanecería igual. ¡Esto significaba que la parte inferior de la mesa estaba fuera de la pantalla!

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

enter image description here

+0

Mi problema original, hace mucho tiempo, era que estas flechas simplemente no estaban disponibles. Nunca entendí por qué, pero volver a crear la vista dentro del controlador de vista lo solucionó. –

+0

@StevenFisher ¡es bueno saberlo! ¡Gracias! – mikeho

2

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

UIApplicationWillChangeStatusBarFrameNotification

Registro como un observador:

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

A continuación, responder a los cambios en el controlador:

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

Incluso con la configuración del autolayout 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 después de que la barra de estado haya cambiado.

Documentation

1

Usted tendrá que actualizar los puntos de vista de forma manual si está configurando su punto de vista marcos 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 el uso de este puede actualizar sus marcos en consecuencia.

Cuestiones relacionadas