web-dev-qa-db-fra.com

Problème UINavigationBar / Status Bar dans IOS7

EDIT FINAL

(Plutôt que d'avoir une question trop longue avec des modifications apportant une modification finale à des fins de clarification, veuillez consulter d'autres modifications si nécessaire).

Configuration du contrôleur

J'ai une application qui est configurée comme suit:

InitialViewController (sous-classe de ECSlidingViewController )

Contrôleur de navigation principal (sous-classe de UINavigationController)

Contrôleur de vue principale (sous-classe de UIViewController)


Dans viewDidLoad de initialViewController, je charge le contrôleur de navigation principal avec le contrôleur Home View en tant que racine.

self.topViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MainNavVC"];

Le problème

Lors du premier chargement de l'application, la barre d'état et la barre de navigation sont séparées. enter image description here

C'est l'effet désiré.

Cependant, je charge ensuite un contrôleur de vue modale et le ferme à l'aide des méthodes standard:

[self performSegueWithIdentifier:@"LoadSelectOpponentVC" sender:self];

Puis fermez avec:

[self dismissViewControllerAnimated:YES completion:nil];

À son tour, le contrôleur de navigation principal (qui tient le contrôleur de vue principale) affiche de manière incorrecte la barre d'état et se chevauche:

enter image description here

Essai

  1. Le paramètre Plist est défini sur YES - View controller-based status bar appearance
  2. J'ai essayé de définir le edgesForExtendedLayout sur aucun, mais aucun changement.

Enregistrement

J'ai essayé de déconnecter certains cadres pour voir où le problème se produit:

Au premier chargement:

Navigation principale VC - Cadre - {{0, 0}, {320, 480}}

Main Nav VC - Nav Bar Frame - {{0, 0}, {320, 44}}

Initial VC - View Frame - {{0, 0}, {320, 480}}

Home VC - View Frame - {{0, 0}, {320, 480}} -- viewDidLoad Home VC

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

--- After Modal is opened/closed ----

Home VC - View Frame - {{0, 64}, {320, 416}} -- viewWillAppear Home VC

Main Nav VC - View Frame - {{0, 0}, {320, 480}} -- viewWillAppear Main Nav

Main Nav VC - Nav Bar Frame - {{0, 20}, {320, 44}} -- viewWillAppear Main Nav

Home VC - View Frame - {{0, 44}, {320, 436}} -- viewDidAppear Home VC
47
StuartM

Avez-vous essayé Apple concernant "Empêcher la barre d'état de couvrir vos vues": https://developer.Apple.com/library/content/qa/qa1797/_index. html

Et avez-vous consulté "UIBarPositioningDelegate": https://developer.Apple.com/documentation/uikit/uibarpositioningdelegate

39
Nicolas Buquet

Dans iOS 7.0, UIViewController fonctionne par défaut de cette façon. La vue sera en plein écran si vous utilisez UIViewController dans UINavigationController et que navigationBar est visible.

Si navigationBar est visible, procédez comme suit. ==>

self.edgesForExtendedLayout = UIRectEdgeNone

si navigationBar est masqué, procédez comme suit. ==>

Ajustez tous les éléments UIView en décalant de 20 points

Si vous utilisez Interface Builder, vous pouvez utiliser les deltas iOS6/7: D'abord, "Afficher sous iOS 6.0", puis définissez un delta de "20" pour obtenir le décalage de +20 dans iOS 7.

26
Sunil Adhyaru

Je suis surpris que personne n'ait encore trouvé la bonne réponse. UIBarPositioningDelegate fonctionne à merveille! Faites simplement de votre contrôleur de vue un UIBarPositioningDelegate et affectez-le en tant que délégué de la barre. Positionnez la barre à 20 pixels du haut de votre vue. Ajoutez ensuite cette méthode à votre contrôleur de vue (disponible uniquement dans iOS7 +):

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar 
{ 
   return UIBarPositionTopAttached; 
}
18
jbcaveman

J'ai eu un problème similaire avec un bouton de menu "hamburger" qui glissait le contrôleur de vue principal et avait un contrôleur de vue de menu sur le côté. J'ai constaté que la barre de navigation du contrôleur de la vue du menu ne savait pas si la barre d'état était affichée ou non. Je l'ai corrigé en postant une notification lorsque la barre d'état était affichée et que hiddden faisait

[self.navigationController setNavigationBarHidden:YES/NO animated:NO];

dans le contrôleur de vue du menu.

4
Stephen Johnson

J'ai corrigé un tel problème en utilisant la réponse de cet article: iOS 7 | Boutons de la barre de navigation/de la barre d'outils très proches de la barre d'état

En utilisant Autolayout, vous devez ignorer la définition d’un nouveau cadre. Vous devez ajouter une contrainte d'espace maximale égale à 20 pour la barre de contrôle pour iOS 7.

3
grigorievs

Avez-vous essayé d'ajouter le code suivant à votre méthode viewDidLoad:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
    self.edgesForExtendedLayout = UIRectEdgeNone;

Il est rapidement expliqué dans Apple lors de la migration vers iOS 7 modification.

3
Nicolas Buquet

J'ai longuement répondu à ce problème dans cette réponse à une question similaire . La réponse courte est la suivante: il n’ya aucun moyen d’obtenir le comportement de disposition de la barre d’état automatique auquel vous êtes habitué depuis iOS 6 et les versions antérieures. Vous devrez concevoir autour de cela ou trouver un moyen de simuler l'ancien style (je couvre les deux approches).

Je vous conseille vivement de ne pas apporter des ajustements manuels au cadre de la barre de navigation. Laissez UINavigationController gérer vous-même. Très probablement, votre problème est que le cadre de la vue de votre contrôleur de navigation n’est pas égal aux limites de UIScreen.

1
jaredsinclair

Je sais que vous avez ViewController en tant que VC principal. Mais si quelqu'un utilise UITableviewController et a le même problème, ce code résout le problème:

self.tableView.contentInset = UIEdgeInsetsMake(20.0f, 0.0f, 0.0f, 0.0f);
1
macL0vin

Oui eu même problème. suivi toute la démarche mais pas de changement.

Pour que cela fonctionne, assurez-vous que AutoLayout est configuré correctement pour l’ensemble de l’écran et pas seulement pour la vue de dessus/la barre d’outils, comme indiqué dans

"Empêcher la barre d'état de couvrir vos vues": https://developer.Apple.com/library/ios/qa/qa1797/_index.html

Au moins pour toutes les vues situées juste en dessous de la vue principale Viewcontroller.view.

0
brian.clear

Pour moi, la solution consistait à déplacer la barre de navigation à 20 points enter image description here

0
dip

La solution à ce problème est en réalité très simple. Cela implique de manipuler la valeur center.y De UINavigationBar, ce que UIKit utilise en mode natif pour ajuster UINavigationBar à la hauteur de la barre d'état. Par souci de simplicité, j'ai sous-classé UINavigationBar et j'ai procédé comme suit:

@implementation MyNavigationBar

    - (void) setCenter:(CGPoint)center {
        // Anything less than or equal to 22 is something we don't want (below SB height)
        if(center.y > 22) [super setCenter:center];
    }

@end
0
mattsven

Il existe un moyen intégré de le faire. Identique à la réponse de Joel Cave, mais détaillée:

Faites votre barre de navigation avoir une origine Y de 20 points.

Puis dans le fichier .h:

@interface XYZViewController : UIViewController <UIBarPositioningDelegate>

Et dans le fichier .m:

- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationBar.delegate = self;
}

- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { 
    return UIBarPositionTopAttached; 
}
0
Jeffrey Sun