(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).
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"];
Lors du premier chargement de l'application, la barre d'état et la barre de navigation sont séparées.
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:
View controller-based status bar appearance
edgesForExtendedLayout
sur aucun, mais aucun changement.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
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
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.
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;
}
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.
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.
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.
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.
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);
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.
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
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;
}