Barra de estado y problema de barra de navegación en IOS7

Estoy migrando mi aplicación a iOS 7. Por haber entregado el problema de la barra de estado, he agregado este código

if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0f) { CGRect frame = self.navigationController.view.frame; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { frame.origin.y = 20; } else { frame.origin.x = 20; } [self.navigationController.view setFrame:frame]; } 

Esto funciona bien en el caso normal. Si estoy cambiando la orientación (la aplicación solo admite la orientación horizontal) o presentando cualquier controlador de vista y descartando el controlador de vista modelo, mi alineación del controlador de vista cambió. La barra de estado nuevamente se superpone a mi controlador de vista. Esta pieza de código no funciona en absoluto. Guíeme para solucionar este problema de la barra de estado.

Caso 2: Así es como estoy presentando mi controlador de vista

 ZBarReaderViewController *reader = [ZBarReaderViewController new]; reader.readerDelegate = self; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) reader.supportedOrientationsMask = ZBarOrientationMaskLandscape; else reader.supportedOrientationsMask = ZBarOrientationMaskPortrait; [self presentModalViewController:reader animated:YES]; 

Árbitro:

enter image description here

Gracias por adelantado.

Se solucionó el problema de la barra de estado en iOS 7

Finalmente arreglé la barra de estado sobre el problema de vuelta usando la propiedad de valor delta en xcode5. Primero tengo un origen aumentado – y 20pxl para todo el controlador usado en el Xib (parece estar funcionando bien solo en IOS 7), después de eso configuro el valor delta para todo el origen del controlador de vista -y a -20 funciona bien en ambos ios 6 e IOS 7 .

Pasos para hacer eso.

Xcode 5 proporciona una opción de vista previa para ver la apariencia del xib en una vista diferente basada en la versión del sistema operativo.

elija la opción de vista previa del editor asistente

haga clic en editor asistente

enter image description here

y elija la opción de vista previa para previsualizar el controlador de vista seleccionado en una versión diferente. enter image description here

ver la vista previa de la vista del controlador.

enter image description here

en la vista previa puede encontrar la opción de alternar para ver la vista previa en una versión diferente. En la vista previa puede sentir la cuestión de la barra de estado claramente si no se corrige correctamente al alternar la versión.

Tres pasos para solucionar el problema de la barra de estado: paso 1: asegúrese de que la vista nos apunte a 7.0 y más adelante en el inspector de archivos . enter image description here

Paso 2: aumente el origen – y con 20 píxeles (exactamente el tamaño de la barra de estado) para todos los controles agregados en el controlador de vista.

Paso 3: Establezca el valor delta del origen y a -20 para todos los controles, entonces solo se ajustará automáticamente en función de la versión. Utilice la vista previa ahora y sienta la diferencia de que los controles se ajustan automáticamente debido al valor delta. enter image description here

Una vez que se soluciona el problema de la barra de estado, el problema al presentar la vista del modelo (controlador ZbarSDk) también se corrige automáticamente.

Pantalla de vista previa:

enter image description here

Llego tarde a esta respuesta, pero solo quiero compartir lo que hice, que es básicamente
la solución más fácil

Antes que info.plist File > Vaya a su info.plist File y agregue Estilo de barra de estado-> Estilo negro transparente (Alfa de 0.5)

Ahora, aquí va: –

Agregue este código en su AppDelegate.m

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //Whatever your code goes here if(kDeviceiPad){ //adding status bar for IOS7 ipad if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 1024, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //change this to match your navigation bar [self.window.rootViewController.view addSubview:addStatusBar]; } } else{ //adding status bar for IOS7 iphone if (IS_IOS7) { UIView *addStatusBar = [[UIView alloc] init]; addStatusBar.frame = CGRectMake(0, 0, 320, 20); addStatusBar.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:1]; //You can give your own color pattern [self.window.rootViewController.view addSubview:addStatusBar]; } return YES; } 
 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; self.window.clipsToBounds =YES; self.window.frame =CGRectMake(0,20,self.window.frame.size.width,self.window.frame.size.height-20); } [self.window makeKeyAndVisible]; return YES; } 

establece lo siguiente para info.plist

Ver apariencia de barra de estado basada en controlador = NO;

Para ocultar la barra de estado en ios7, siga estos sencillos pasos:

En Xcode vaya a la carpeta ” Resources ” y abra ” (app name)-Info.plist file “.

  • verifica la clave ” View controller based status bar appearance ” y establece su valor ” NO
  • verifique que la clave ” Status bar is initially hidden ” y establezca su valor ” YES

Si las claves no están allí, puede agregarlas seleccionando ” information property list ” en la parte superior y haciendo clic en el ícono +

MUCHA MUCHA respuesta más simple:

Alinee la parte superior de su vista con la “guía de diseño superior”, pero controle-arrastrando “Guía de diseño superior” a su vista y establezca la restricción “vertical”. Vea esta respuesta para una referencia de imagen.

La forma en que funciona es que la “Guía de diseño superior” se ajustará automágicamente para cuando la barra de estado esté o no allí, y todo funcionará, ¡no se requiere encoding!

PD En este ejemplo particular , el fondo que se ve en la parte inferior también debe resolverse estableciendo una restricción vertical apropiada de la parte inferior de la vista, su supervista o lo que sea …

Escuche que podemos hacer esto para todas las vistas a la vez

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { // Notification for the orientaiton change [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationDidChangeStatusBarOrientation:) name:UIApplicationDidChangeStatusBarOrientationNotification object:nil]; // Window framing changes condition for iOS7 or greater if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView = [[UIView alloc] initWithFrame:CGRectMake(0, -20, self.window.frame.size.width, 20)];//statusBarBackgroundView is normal uiview statusBarBackgroundView.backgroundColor = [UIColor colorWithWhite:0.000 alpha:0.730]; [self.window addSubview:statusBarBackgroundView]; self.window.bounds = CGRectMake(0, -20, self.window.frame.size.width, self.window.frame.size.height); } // Window framing changes condition for iOS7 or greater self.window.rootViewController = navigationController; [self.window makeKeyAndVisible]; return YES; } 

Y mientras usamos la orientación, podemos agregar el método siguiente en el delegado de la aplicación para configurarlo por orientación.

 - (void)applicationDidChangeStatusBarOrientation:(NSNotification *)notification { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { statusBarBackgroundView.hidden = YES; UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; int width = [[UIScreen mainScreen] bounds].size.width; int height = [[UIScreen mainScreen] bounds].size.height; switch (orientation) { case UIInterfaceOrientationLandscapeLeft: self.window.bounds = CGRectMake(-20,0,width,height); statusBarBackgroundView.frame = CGRectMake(-20, 0, 20, height); break; case UIInterfaceOrientationLandscapeRight: self.window.bounds = CGRectMake(20,0,width,height); statusBarBackgroundView.frame = CGRectMake(320, 0, 20, height); break; case UIInterfaceOrientationPortraitUpsideDown: statusBarBackgroundView.frame = CGRectMake(0, 568, width, 20); self.window.bounds = CGRectMake(0, 20, width, height); break; default: statusBarBackgroundView.frame = CGRectMake(0, -20, width, 20); self.window.bounds = CGRectMake(0, -20, width, height); break; } statusBarBackgroundView.hidden = NO; } } 

Debe agregar la categoría de controlador de navegación a continuación para ello

.h

 #import  #import  @interface UINavigationController (iOS6fix) @end 

.metro

 #import "UINavigationController+iOS6fix.h" @implementation UINavigationController (iOS6fix) -(BOOL)shouldAutorotate { return [[self.viewControllers lastObject] shouldAutorotate]; } -(NSUInteger)supportedInterfaceOrientations { return [[self.viewControllers lastObject] supportedInterfaceOrientations]; } - (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation { return [[self.viewControllers lastObject] preferredInterfaceOrientationForPresentation]; } @end 

Lo resolví usando el siguiente código

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { if(landScape mode) if ([UIDevice currentDevice].systemVersion.floatValue>=7) { CGRect frame = self.window.frame; frame.size.width -= 20.0f; frame.origin.x+= 20.0f; self.window.frame = frame; } if(portrait) if ([[[UIDevice currentDevice]systemVersion]floatValue] >= 7.0) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; CGRect frame = self.window.frame; frame.origin.y += 20.0f; frame.size.height -= 20.0f; self.window.frame = frame; } return YES; } 
 #define _kisiOS7 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) if (_kisiOS7) { [[UINavigationBar appearance] setBarTintColor:_kColorFromHEX(@"#011C47")]; } else { [[UINavigationBar appearance] setBackgroundColor:_kColorFromHEX(@"#011C47")]; [[UINavigationBar appearance] setTintColor:_kColorFromHEX(@"#011C47")]; } 

simplemente configure el siguiente código en viewWillAppear .

  if ([[[UIDevice currentDevice] systemVersion] floatValue]< = 7) { self.edgesForExtendedLayout = UIRectEdgeNone; } 

Con Salesforce SDK 2.1 (Cordova 2.3.0) tuvimos que hacer lo siguiente para que la barra de estado apareciera en la carga inicial de la aplicación y volviendo desde el fondo (iPhone y iPad):

Contrariamente a otras soluciones publicadas aquí, esta parece sobrevivir a la rotación del dispositivo.

1- Crea una categoría del SFHybridViewController

 #import "SFHybridViewController+Amalto.h" @implementation SFHybridViewController (Amalto) - (void)viewWillAppear:(BOOL)animated { //Lower screen 20px on ios 7 if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewWillAppear:animated]; } - (void)viewDidLoad { if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { CGRect viewBounds = self.view.bounds; viewBounds.origin.y = 20; viewBounds.size.height = viewBounds.size.height - 20; self.webView.frame = viewBounds; } [super viewDidLoad]; } @end 

2- Agregar a AppDelegate.m importaciones

 #import "SFHybridViewController+Amalto.h" 

3- Inyectar al final del método didFinishLaunchingWithOptions of AppDelegate

 //Make the status bar appear if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) { [application setStatusBarStyle:UIStatusBarStyleLightContent]; [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; } 

4- Agregar a App-Info.plist la propiedad

View controller-based status bar appearance con el valor NO

Hay varias formas diferentes. Un enfoque es usar el archivo .plist

  • Agregue una nueva clave ” Ver apariencia de la barra de estado basada en el controlador ” y establezca el valor como ” NO “.
  • Agregue otra clave “La barra de estado está inicialmente oculta ” y establezca el valor como ” “.

Esto ocultará la barra de estado durante todo el proyecto.

Captura de pantalla para enfoque