web-dev-qa-db-fra.com

comment présenter un contrôleur de vue sur iOS7 sans que la barre d'état ne se chevauche

Je vois que lorsque j'ai migré mon application vers iOS 7, la barre de navigation apparaît sous la barre d'état lors de la présentation d'un contrôleur de vue. Je pense que beaucoup de gens ont rencontré ce même problème. Voici une capture d'écran de ce que je vois:

existing nav

Exigences:

  • La nouvelle vue doit apparaître "de façon modale", c'est-à-dire que j'ai besoin de presentViewController.

  • Affichez une sorte de barre de navigation ou de barre d'outils, la barre d'état prenant la couleur d'arrière-plan du style de barre de navigation sous iOS 7.

  • Cela doit fonctionner sur iOS 6.

  • J'utilise un xib pour gérer la mise en page, avec la mise en page automatique activée.

Options:

A. Décalez un peu le cadre de votre vue.

Ugh, revenons-nous à la pré-iOS 5 jours et au déblayage avec des cadres? De plus, ce n'est généralement pas une bonne idée de mélanger avec la mise en page automatique.

B. Ajoutez un petit espace en haut sous votre barre de navigation.

Un inconvénient des options A et B est que la barre d'état ne se fondra pas dans votre navigation:

nav with gap

C. Ajoutez des contraintes par programme.

Le principal inconvénient est que vous devrez nettoyer les contraintes et calculer les hauteurs de navigation et de barre d'état. Beurk.

D. Étirez la hauteur de la barre de navigation/barre d'outils pour inclure la zone de la barre d'état.

A l'air bien sur iOS 7, mais tombe en panne sur iOS 6. Vous devrez mettre à jour par programmation la hauteur de la barre de navigation et vous assurer également que le reste de votre vue est mis à jour de manière appropriée. Désordonné.

enter image description here

E. Mess avec deltas iOS6/7 dans IB.

Inconvénients multiples: vous coderez en dur les deltas ios6/7. Ne fonctionne pas non plus avec la mise en page automatique.

F. Utilisez un UINavigationController imbriqué.

C'est la solution de contournement que j'ai sélectionnée. Voir la réponse ci-dessous.

uinavcontroller workaround

20
bobics

La solution de contournement la plus simple que j'ai trouvée consiste à encapsuler le contrôleur de vue que vous souhaitez présenter à l'intérieur d'un contrôleur de navigation, puis à présenter ce contrôleur de navigation.

MyViewController *vc = [MyViewController new];
UINavigationController *nav = [[UINavigationController alloc] 
    initWithRootViewController:vc];
[self presentViewController:nav animated:YES completion:NULL];

Avantages:

  • Pas de déblayage avec des cadres nécessaires.
  • Le même code fonctionne sur iOS 6 et iOS 7.
  • Moins moche que les autres solutions de contournement.

Désavantages:

  • Vous voudrez probablement laisser votre XIB vide de barres de navigation ou de barres d'outils et ajouter par programme UIBarButtonItems à la barre de navigation. Heureusement, c'est assez simple.
27
bobics

Vous devez ajouter une contrainte verticale de votre vue la plus haute à Guide de mise en page supérieur comme décrit dans l'article suivant d'Apple.

https://developer.Apple.com/library/ios/qa/qa1797/_index.html

enter image description here

7
Yas T.

Le code suivant a fonctionné pour moi. Il suffit de le mettre sur le contrôleur qui présente le nouveau contrôleur.

#pragma mark hidden status bar
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
{
    [[UIApplication sharedApplication] setStatusBarHidden:YES];
}
2
Jwlyan

ouvrez votre fichier xib et sélectionnez le viewcontroller. dans l'onglet inspecteur, sélectionnez les attributs et sélectionnez dans la barre supérieure "Barre de navigation opaque". Cela a résolu le problème pour moi.

0
thorb65