Dans un contrôleur de navigation, vous obtenez automatiquement la couleur et la position correctes d'une barre de navigation comme prévu.
comme ça
Mais en vue modale, lorsque vous faites glisser une barre de navigation, vous pouvez la positionner tout en haut, ce qui est trop proche des informations sur le support/la batterie.
Vous pouvez donc le faire glisser vers le bas, deviner dans quelle mesure il correspond à la position de celui créé automatiquement, mais vous avez alors une différence de couleur. J'ai essayé de changer les paramètres de la barre d'état dans IB, cela ne fait aucune différence.
Existe-t-il un moyen correct de résoudre ce problème, comme pour faire ressembler une vue modale à la vue de navigation générée automatiquement?.
Merci
La meilleure façon de résoudre ce problème dans iOS 7 est de se conformer au nouveau protocole UIBarPositioningDelegate
.
Vous connectez le délégué de votre barre de navigation à votre contrôleur de vue (définissez votre contrôleur de vue comme délégué pour la barre de navigation via le storyboard ou le code) et vous conformez à ce protocole et en implémentant la méthode
-(UIBarPosition)positionForBar:(id<UIBarPositioning>)bar { return UIBarPositionTopAttached; }
Vous pouvez supprimer l'espace supérieur dans le contrôleur de vue. Vous devez placer la barre 20 points sous le bord supérieur
Compris les 3 options pour résoudre ce problème.
Option 1: redimensionner la barre de navigation
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
// iOS 7
self.navBar.frame = CGRectMake(self.navBar.frame.Origin.x, self.navBar.frame.Origin.y, self.navBar.frame.size.width, 64);
}
Option 2: masquer la barre d'état
Par exemple, dans la vue modale où vous souhaitez masquer la barre d'état
Ajoutez cette méthode
- (BOOL)prefersStatusBarHidden
{
return YES;
}
Dans viewDidLoad ajouter
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationSlide];
}
Maintenant, lorsque vous quittez la vue modale et que vous souhaitez que votre barre d'état s'affiche à nouveau. Ajouter ceci en vue
float currentVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= currentVersion) {
[self prefersStatusBarHidden];
[self performSelector:@selector(setNeedsStatusBarAppearanceUpdate)];
NSLog(@"ios7");
}
else {
[[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationSlide];
}
et cela, mais retournez NON cette fois
- (BOOL)prefersStatusBarHidden
{
return NO;
}
Option 3: Intégrer dans Nav Controller
Sélectionnez votre vue modale, intégrez-la simplement dans un contrôleur de navigation.
Dans Swift:
La meilleure façon de surmonter cela dans iOS 8.1 et Swift est de se conformer au nouveau protocole UIBarPositioningDelegate.
Vous connectez le délégué de votre barre de navigation à votre contrôleur de vue et vous conformez à ce protocole et en appelant la méthode:
func positionForBar(bar: UIBarPositioning) -> UIBarPosition {
return UIBarPosition.TopAttached
}
Vous pouvez supprimer l'espace supérieur dans le contrôleur de vue. Vous devez placer la barre 20 points sous le bord supérieur.
Pour Swift3, utilisez ce qui suit.
func position(for bar: UIBarPositioning) -> UIBarPosition{
return .topAttached;
}
J'ai créé un contrôleur de navigation, supprimé le "contrôleur de vue racine" qui l'accompagnait. Maintenez ensuite la touche Ctrl enfoncée et faites glisser le "Contrôleur de navigation" sur votre vue (supprimez la barre de navigation que vous avez ajoutée manuellement auparavant). Définissez le contrôleur de navigation comme "contrôleur de vue initial" et cela fonctionne bien pour moi maintenant.
Après quelques tentatives pour déplacer la barre de navigation de quelques pixels vers le bas dans iOS 7, voici ce qui a finalement fonctionné pour moi:
-(void)viewWillLayoutSubviews
{
float iosVersion = 7.0;
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= iosVersion) {
// iOS 7+
CGRect viewFrame = self.view.frame;
viewFrame.Origin.y += 10;
self.view.frame = viewFrame;
}
}
J'ai également ajusté la couleur de la barre d'état pour mieux correspondre à mon contenu:
-(UIStatusBarStyle)preferredStatusBarStyle{
return UIStatusBarStyleLightContent;
}