Translucidité de la barre d'état iOS 7 avec compatibilité descendante

J'ai construit mon application pour avoir une barre de navigation translucide dans iOS 6. Je voudrais utiliser la barre d'état translucide dans iOS 7 et conserver l'application telle qu'elle est dans iOS 6, mais mon contenu est toujours sous la barre d'état dans iOS 7, avec 20px manquant sur le fond. Je me dis que je peux faire les changements de code très fastidieux qui vérifient si l'appareil a iOS 7, puis ajuster mon contenu en conséquence, mais je crains que cela va être beaucoup de travail.

Idéalement, je voudrais append 20px de remplissage au sumt de la vue de chaque controller de vue, de sorte que le contenu se décale, et fonctionne encore bien avec une barre de navigation opaque sur iOS 6.

J'ai lu les discussions qui existent sur le sujet 1 2 , mais aucune des réponses fournies n'a résolu mon problème.

Je dois noter que je n'utilise PAS Interface Builder et que tous mes VC sont créés par programmation.

Merci beaucoup pour vos suggestions!

Si vous utilisez auto layout , tout ce que vous devez faire est d'append une Vertical Constraint de votre vue la plus haute au Top Layout Guide comme indiqué ci-dessous et il faut prendre soin de l'espacement supérieur.

entrez la description de l'image ici

Pour plus d'informations: https://developer.apple.com/library/ios/qa/qa1797/_index.html

Vous pouvez utiliser la nouvelle fonctionnalité Xcode 5 des deltas iOS6 / 7 pour définir -20 sur votre vue, ce qui vous donnera une expérience similaire. Définissez correctement vos vues pour iOS7 dans le Générateur d'interface et utilisez les deltas pour la prise en charge iOS6.

Voici ce que j'ai fait pour toujours remplir le haut de ma vue avec 20px (hauteur de la barre d'état).

J'ai utilisé ce code dans l'application de mon AppDelegate: didFinishLaunchingWithOptions: méthode

 ... // 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 mesortingcs:nil views:viewDictionary]; [newRootController.view addConstraints:constraints]; constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[aView]|" options:0 mesortingcs:nil views:viewDictionary]; [newRootController.view addConstraints:constraints]; self.window.rootViewController = newRootController; } else { // pre iOS 7 self.window.rootViewController = container; } 

Maintenant, quand vous êtes dans iOS 7, tout existera dans la vue du controller de vue racine qui est décalée de 20 pixels vers le bas. Vous n'aurez à le faire qu'une seule fois dans votre AppDelegate.

Définissez 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éthode UIApplicationstatusBarStyle`).

Dans l'application AppDelegate: didFinishLaunchingWithOptions, appel

 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; 

Vous pouvez désactiver la vue située sous la barre supérieure dans ios 7 en définissant les parameters suivants:

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