2010-10-16 12 views
14

Estoy creando una aplicación para iPhone con pocos elementos dentro del controlador (por ejemplo, barra de pestañas, uiview, uitoolbar, etc.). Todo funciona bien hasta que encontré este problema. Mientras se inicia mi aplicación, recibí una llamada y se muestra la "Barra de estado de llamada" que arruinó la interfaz de usuario. Algunos elementos se presionan hacia abajo porque la "Barra de estado de llamada" ocupa espacio en la parte superior.Iphone- ¿Cómo cambiar el tamaño de la vista cuando se activa la barra de estado de la llamada?

¿Alguien aquí tiene una idea sobre cómo solucionar este problema? Soy nuevo en el desarrollo de aplicaciones para iPhone.

Tu respuesta es muy apreciada ...

Best Regards,

Respuesta

12

Usted debe poner esta función en AppDelegate, esto desencadenará cuando el cambio de barra de estado

- (void)application:(UIApplication *)application didChangeStatusBarFrame (CGRect)oldStatusBarFrame 
{ 
    NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    [dict setObject:@"trigger" forKey:@"frame"]; 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"trigger" object:self userInfo:dict]; 
} 

Este Código enviará una notificación con el nombre de "activación"

Coloque un código a su controlador de vista (por ejemplo: viewDidLoad, etc ..) esta escucha si hay notificación de enviar con un "disparador" nombre

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(dataReceived:) 
              name:@"trigger" 
              object:nil]; 

y crear una función DataReceived:

- (void)dataReceivedNotification:(NSNotification *)notification { 
    NSDictionary *data = [notification userInfo]; 
    // do something with data 
} 

hacer algo en esta parte del código, tal vez se cambia el marco de su barra de pestañas, marco UIView, marco de la barra de herramientas

Y en dealloc, poner este código para eliminar el observador

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+0

Esto funciona para mí ... Gracias –

+0

Consulte @ process255 para obtener una respuesta más correcta. Además, la utilización de literales sin formato para publicar/suscribir notificaciones es una mala práctica (propenso a errores y errores tipográficos, debe definir sus nombres de notificación 'NSString * const' de antemano). –

+0

@dianz has cambiado la clave y el valor en dict. "disparador" debería ser la clave. – Kof

3

Básicamente lo que normalmente hacemos es intentar configurar las banderas AUTORESIZE de todos los elementos de la interfaz de usuario en el constructor de interfaces de modo que cuando la vista principal es "aplastado" por la barra de estado de llamadas, todo se verá razonable. Es un poco difícil explicar cómo hacer todo esto en un mensaje, pero recomiendo crear una vista en IB, colocar algunas subvistas en ella, luego cambiar el tamaño de la vista principal mientras se juegan con las banderas de autoresize para tener una idea de cómo las banderas trabajo. Las banderas de autoresize están en Command-3 (inspector de tamaño).

También puede establecer wantsFullScreenLayout en el controlador de vista principal en YES para hacer que la vista ocupe toda la pantalla, incluido el área debajo de la barra de estado, pero luego deberá asegurarse de no colocar nada debajo del la barra de estado y la barra de estado de la llamada se superpondrán a algo demasiado cercano, por supuesto.

+0

¿Qué ocurre con el entorno de limitaciones de iOS7/AutoLayout? –

21

La solución de dianz funciona bien, pero es un poco redundante si solo está interesado en conocer la notificación dentro de un controlador de vista específico.

Después de llamar al método de delegado application:didChangeStatusBarFrame: en la aplicación Delegado UIApplicationDidChangeStatusBarFrameNotification se publica a través de [NSNotificationCenter defaultCenter].

En lugar de utilizar el método de delegado application:didChangeStatusBarFrame: para simplemente volver a publicar una notificación personalizada, puede agregar un observador a UIApplicationDidChangeStatusBarFrameNotification directamente desde su controlador de vista.

En MyCustomViewController deberá añadir algo similar a esto:

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(doSomething:) 
              UIApplicationDidChangeStatusBarFrameNotification 
              object:nil]; 

Ahora ya no es necesario definir el método application:didChangeStatusBarFrame: delegado en AppDelegate (a menos que pretenda hacer algo en el AppDelegate cuando la barra de estado cambia de tamaño)

Al igual que con el ejemplo de dianz tiene que quitar el observador en dealloc

- (void)dealloc { 
    [[NSNotificationCenter defaultCenter] removeObserver:self]; 
    [super dealloc]; 
} 
+5

Gran respuesta, excepto que accidentalmente (basado en la pregunta original, de todos modos) usó 'UIApplicationWillChangeStatusBarOrientationNotification' en lugar de' UIApplicationWillChangeStatusBarFrameNotification'. Si está intentando averiguar cuándo aparece o desaparece la barra de estado verde de la llamada entrante, quiere lo último: 'UIApplicationWillChangeStatusBarFrameNotification'. –

+0

Muy cierto, gracias por la actualización! –

1

para mí, cada vez que se agranda la barra de estado, el - (void) viewWillLayoutSubviews siempre se llama. Esto es perfecto para mí porque todo el código de configuración de mi subvista está en esta función.

Cuestiones relacionadas