web-dev-qa-db-fra.com

iOS 7 | Boutons de la barre de navigation/barre d’outils très proches de la barre d’état

J'ai un problème à faire glisser une barre de navigation ou une barre d'outils (storyboard) sur mon contrôleur de vue.

Barre de navigation:

UINavigationBar

Comme vous pouvez le voir sur l'image ci-dessus, le bouton droit chevauche presque la barre d'état.

Avec un UIToolbar, il se passe la même chose:

UIToolbar

Ce contrôleur de vue est destiné à être utilisé en tant que modal, c'est pourquoi je n'utilise pas de contrôleur UINavigationController.

Dans une autre section, j’utilise un UINavigationController et il apparaît comme je l’attendais:

UINavigationController

Comment puis-je faire glisser une barre UINavigationBar/UIToolbar sur un contrôleur de vue sans chevaucher la barre d'état?

40
Axort

Les barres de navigation ou les barres d’outils doivent être à (0, viewController.topLayoutGuide.length) avec un positionnement des barres de UIBarPositionTopAttached. Vous devez définir le délégué de votre barre de navigation ou de votre barre d'outils sur votre contrôleur de vue, et renvoyer UIBarPositionTopAttached. Si positionné correctement, vous aurez le résultat dans votre troisième image.

Plus d'informations ici: https://developer.Apple.com/documentation/uikit/uibarpositioningdelegate?language=objc

48
Leo Natan

Faire ces étapes

Faites glisser la NavigationBar vers votre ViewController dans Xib, définissez ViewController en tant que délégué . Notez que la NavigationBar doit être à (0, 20)

Dans ViewController, conformez-vous à la UINavigationBarDelegate

@interface ETPViewController () <UINavigationBarDelegate>

Implémenter cette méthode

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

positionForBar indique à la barre de navigation si elle doit étendre son arrière-plan vers le haut de la barre d'état

25
onmyway133

S'il vous plaît voir ma réponse ici, j'ai copié le contenu ci-dessous pour plus de commodité:

https://stackoverflow.com/a/18912291/1162959

La solution de contournement la plus simple que j'ai trouvée consiste à envelopper 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 barre XIB vide de barres de navigation ou de barres d'outils et ajouter par programme UIBarButtonItems à la barre de navigation. Heureusement c'est assez facile.
9
bobics

Vous pouvez résoudre ce problème à l'aide de la disposition automatique, comme indiqué dans cette note technique (Empêcher la barre d'état de couvrir vos vues).

Voici quelques extraits:

Ajouter la contrainte d'espace vertical à la vue la plus haute

  • Faites glisser le contrôle de la barre UIToolbar vers le "Guide de mise en page supérieur"
  • Dans le popover, choisissez "Espacement vertical"
  • Remplacez la constante "Contrainte d'espace verticale" par 0 (zéro)

Si vous avez d'autres sous-vues sous la barre UIToolbar, ancrez ces vues à la barre d'outils au lieu du Guide de mise en page supérieur

Cela supportera iOS 6 et iOS 7.

5
David

J'ai abandonné et je devais définir la contrainte de hauteur de la barre de navigation sur 64 dans x xib VC car viewController.topLayoutGuide.length est à 0 dans viewDidLoad malgré la présence de la barre d'état: - [, Ce qui signifie un non universel application sur ipad vous auriez 20 px en haut de la vue perdue (la barre d’état de la cause est distincte de la fenêtre de simulation de l’iphone)

0
Anton Tropashko

Vous pouvez également le gérer en augmentant la hauteur de la barre de navigation en fournissant une image de taille 620x128 pour la version ios. Et cette image est utilisée dans: 

if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)?YES:NO) {
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"newImage.png"] forBarMetrics:UIBarMetricsDefault];
}else{
    [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"previousImage.png"] forBarMetrics:UIBarMetricsDefault];
}
0
Utkarsh Goel