Translucidez de barra de estado de iOS 7 con compatibilidad hacia atrás

Construí mi aplicación para tener una barra de navigation translúcida en iOS 6. Me gustaría utilizar la barra de estado translúcida en iOS 7 y mantener la aplicación tal como está en iOS 6, pero mi contenido siempre está debajo de la barra de estado en iOS 7, con Falta 20 píxeles en la parte inferior. Me imagino que puedo hacer los muy tediosos cambios de código que comtestingn si el dispositivo tiene iOS 7 y luego ajustar mi contenido en consecuencia, pero temo que esto sea mucho trabajo.

Idealmente, me gustaría agregar 20px de relleno a la parte superior de la vista del controller de cada vista, para que el contenido se desplace hacia abajo, y aún funciona bien con una barra de navigation opaca en iOS 6.

He leído los subprocesss que existen sobre el tema 1 2 , pero ninguna de las respuestas proporcionadas resolvió mi problema.

Debo tener en count que NO estoy usando Interface Builder y todos mis VC se crean de manera programática.

Muchas gracias por cualquier sugerencia!

Si usa el auto layout , lo único que debe hacer es agregar una Vertical Constraint desde la vista Top Layout Guide hasta la Top Layout Guide como se muestra a continuación y debe tener cuidado con el espacio superior.

introduzca la descripción de la imagen aquí

Para más información: https://developer.apple.com/library/ios/qa/qa1797/_index.html

Puede usar la nueva function Xcode 5 de los deltas iOS6 / 7 para configurar -20 a toda su vista, lo que le brindará una experiencia similar. Establezca sus vistas correctamente para iOS7 en el generador de interfaces y use deltas para la compatibilidad con iOS6.

Esto es lo que hice para rellenar siempre la parte superior de mi vista con 20 píxeles (altura de la barra de estado).

Utilicé este código en la aplicación de mi AppDelegate: didFinishLaunchingWithOptions: method

 ... // container holds my root view controller UINavigationController *container = [UINavigationController alloc] init...]; ... if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { // iOS 7 // Create parent controller that will contain your existing root view controller's view shifted 20 px down to account for the status bar. UIViewController *newRootController = [[UIViewController alloc] init]; // Add my old root view controller as a child [newRootController addChildViewController:container]; // Add its view as a subview [newRootController.view addSubview:container.view]; // Call this method because it does some configuration? [container didMoveToParentViewController:newRootController]; // Now just position the view starting at point (0, 20) UIView *aView = container.view; NSDictionary *viewDictionary = NSDictionaryOfVariableBindings(aView); NSArray *constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-20-[aView]|" options:0 metrics:nil views:viewDictionary]; [newRootController.view addConstraints:constraints]; constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aView]|" options:0 metrics:nil views:viewDictionary]; [newRootController.view addConstraints:constraints]; self.window.rootViewController = newRootController; } else { // pre iOS 7 self.window.rootViewController = container; } 

Ahora cada vez que estás en iOS 7, todo existirá en la vista del controller de vista raíz que se desplaza 20 píxeles hacia abajo. Solo tendrás que hacer esto una vez en tu AppDelegate.

Establezca UIViewControllerBasedStatusBarAppearance' to NO in info.plist (To opt out of having view controllers adjust the status bar style so that we can set the status bar style by using the método UIApplicationstatusBarStyle.)

En la aplicación de AppDelegate: didFinishLaunchingWithOptions, call

 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; self.window.clipsToBounds =YES; self.window.frame = CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); //Added on 19th Sep 2013 self.window.bounds = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height); } return YES; 

Puede deshabilitar la vista que se encuentra debajo de la barra superior en ios 7 configurando lo siguiente:

 if([controller canPerformAction:@selector(setEdgesForExtendedLayout:) withSender:self]) { [controller setEdgesForExtendedLayout:UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight]; }