web-dev-qa-db-fra.com

Position de la barre de navigation pour la vue modale - iOS7

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

enter image description here

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.

enter image description here

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.

enter image description here

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

39
DogCoffee

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

81
Matt

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.

enter image description here

27
DogCoffee

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.

5
King-Wizard

Pour Swift3, utilisez ce qui suit.

func position(for bar: UIBarPositioning) -> UIBarPosition{
    return .topAttached;
}
2
Susobhan Das

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.

0
philipzimmermann

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;
}
0
derekg