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:
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:
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:
Comment puis-je faire glisser une barre UINavigationBar/UIToolbar sur un contrôleur de vue sans chevaucher la barre d'état?
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
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
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];
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.
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)
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];
}