Mover la barra de estado en iOS 7

El problema que estoy enfrentando es este:

Quiero implementar una aplicación iOS 7 con un diseño agradable y menú izquierdo / derecho, que aparece después de que la vista principal se anima a la derecha / izquierda. Estoy haciendo esto con el [UIView animateWithDuration...] , pero eso no es realmente importante. Lo que quiero lograr es el mismo efecto que tiene la aplicación Mailbox iOS 7: para mover la barra de estado (hacia la derecha / izquierda) con la vista principal

Imagen para una mejor explicación:

Aplicación de buzón con barra de estado movida hacia un lado

Lo que solo encontré es este artículo sobre el tema, con algunos códigos de trabajo que usan API privadas, que me gustaría no usar, ya que quiero que mi aplicación sea aceptada en la App Store.

Me gustaría lograr el mismo efecto (‘legalmente’). ¿Alguien sabe cómo hacerlo?

¡Gracias!

La esencia de esto es usar este método introducido en iOS 7:

https://developer.apple.com/documentation/uikit/uiscreen/1617814-snapshotview :

Con eso obtienes una UIView que contiene una captura de pantalla que incluye la barra de estado. Una vez que tienes eso, solo es cuestión de ocultar tu vista actual y luego presionar la vista de captura de pantalla.

Publiqué una prueba de concepto aquí: https://github.com/simonholroyd/StatusBarTest

NOTA: No he enviado código que haga esto a través del proceso de revisión de Apple, pero este no es un método API privado.

Entonces, después del impulso inicial por parte del Sr. Simon Holroyd y algunas búsquedas, encontré la solución de cómo lograr esta funcionalidad de “efecto”. Este es el código:

 statusbarView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 20)]; 

EDITAR: mister pcholberg señaló correctamente que el código anterior no funcionaba en el dispositivo real, solo en el simulador de iOS, así que lo he editado con su recomendación

 if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { UIView *screenShot = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:NO]; [statusbarView addSubview:screenShot]; [statusbarView setClipsToBounds:YES]; [self.view addSubview:statusbarView]; [self setPrefersStatusBarHidden:YES]; [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; } 

 - (BOOL)prefersStatusBarHidden { return prefersStatusBarHidden; } 

Entonces, la primera parte crea contexto, usa el método mencionado por Simon, dibuja la vista con la barra de estado y la guarda como UIImage

La segunda parte agrega la instantánea UIView a mi viewController’s UIView

Y la tercera parte establece mi bool para la barra de estado en SÍ (para un uso más fácil en el método anterior), y llama a métodos para volver a dibujarlo

Esto luego establece UIView como la barra de estado no funcional en su lugar y oculta la original, por lo que no hay doble representación. Entonces puedo usar esta vista en mi [UIView animateWithDuration... method

Y cuando regreso, uso este código en el controlador de finalización del bloque de animación:

 [statusbarView removeFromSuperview]; if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0")) { [self setPrefersStatusBarHidden:NO]; [self prefersStatusBarHidden]; [self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)]; } 

¡Y voilá! Esto funciona como el efecto descrito en mi pregunta.

Espero que esto ayude a alguien!

Utilizo este método para mover la barra de estatuas con la vista del control deslizante, en una aplicación hay dos ventanas, una ventana normal, otra statuBarWindow, obtengo statuBarView que superView es statuBarWindows, y lo muevo con la vista del control deslizante.

 - (UIView *)statuBarView { NSString *key = [[NSString alloc] initWithData:[NSData dataWithBytes:(unsigned char []){0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x61, 0x72} length:9] encoding:NSASCIIStringEncoding]; id object = [UIApplication sharedApplication]; UIView *statusBar = nil; if ([object respondsToSelector:NSSelectorFromString(key)]) { statusBar = [object valueForKey:key]; } return statusBar; } 

Acabo de crear BSPanViewController, lo que hace que sea extremadamente fácil lograr este efecto. El control y las instrucciones sobre cómo usarlo se pueden encontrar en GitHub .

La implementación es la misma que la explicada por Simon Holroyd .

En mi experiencia, los revisores de la App Store generalmente no se preocupan por el uso privado de la API, especialmente este simple e inofensivo. Para la tarea, puede obtener un puntero a la vista de la barra de estado de la aplicación a través de varios métodos, que puede encontrar en los encabezados completos de iOS, como https://github.com/nst/iOS-Runtime-Headers.