Bonjour chers développeurs,
Je suis surpris que je n'ai trouvé aucune information sur ce cas d'utilisation particulier pour iOS 8. Laissez-moi vous expliquer, j'ai une pile de contrôleurs de navigation, la première vue a sa barre de navigation masquée, lorsque l'utilisateur clique sur une cellule pour une nouvelle vue est poussé et j'ai besoin de la barre de navigation montrée sur cette vue pour revenir en arrière (évidemment). Sur iOS 7, il suffisait d'ajouter cette ligne dans viewWillAppear:
[self.navigationController setNavigationBarHidden:NO animated:YES];
Et cela fonctionne comme un charme. Mais à partir de iOS 8, j'ai du mal à adopter le même comportement. Pour l'instant j'ai réussi à faire la même chose en utilisant:
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0"))
[self.navigationController setNavigationBarHidden:NO animated:NO];
}
- (void)viewDidLoad {
[super viewDidLoad];
if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"8.0")) {
self.automaticallyAdjustsScrollViewInsets = NO;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.collectionView.contentInset = UIEdgeInsetsMake(self.navigationController.navigationBar.frame.size.height, 0, 0, 0);
} }
Et changer le contentInset de mes collectionsView/tableviews tout ce que j'ai besoin d'afficher. Cela fonctionnera, mais c'est vraiment pénible pour le * (parfois, l'insertion de contenu n'est pas nécessaire si l'utilisateur provient d'un nouveau contrôleur de vue).
Pour le contexte, le projet a d'abord été développé pour gérer iOS 6 et 7, donc pas de storyboard, tout est fait par programme. J'ai porté l'application sur une base de code plus moderne et je l'ai rendue universelle.
Est-ce que je manque quelque chose? Existe-t-il un meilleur moyen de gérer cela dans iOS 7/8?
Vous voulez le cacher dans viewWillAppear
et le montrer à nouveau dans viewWillDisappear
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.navigationBar.isHidden = true
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.isHidden = false
}
Je pensais que la ligne est:
self.navigationController.navigationBar.hidden = YES;
Je vérifie et cela fonctionne bien pour moi. . . Essayez. . .
Faites ceci animé pour obtenir une transition en douceur:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.navigationController setNavigationBarHidden:YES animated:YES];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:NO animated:YES];
}
Sur iOS 8
, il semble que navigationBarHidden
ne soit pas identique à navigationBar.hidden
. (Je construis avec la cible de déploiement iOS 6
- je ne suis pas sûr que cela fasse une différence).
Dans mon code, examinez le débogueur avec les lignes consécutives suivantes:
bool b1 = self.navigationController.navigationBarHidden; // FALSE
bool b2 = self.navigationController.navigationBar.hidden; // TRUE
b1
indique false et b2
à true.
Paramétrer self.navigationController.navigationBar.hidden = false
résout le problème
J'ai eu le même problème et j'ai vraiment tout essayé, mais la barre de navigation ne s'est pas affichée. Finalement, j'ai réalisé que j'avais ce code dans mon premier contrôleur de vue :-)
[self.navigationController setNavigationBarHidden:YES];
J'ai pensé que quelqu'un d'autre qui vérifiait cette question avait fait mon erreur, alors j'ai pensé que cela méritait d'être mentionné.
Il y a plusieurs techniques. Le moins de frottement on serait:
open class ViewController: UIViewController {
open var hidesNavigationBarWhenPushed = false
override open func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
navigationController?.setNavigationBarHidden(hidesNavigationBarWhenPushed, animated: animated)
}
}
Mais cela vous donnerait ce résultat .
Alternativement, je suggérerais d'utiliser ma bibliothèque HidesNavigationBarWhenPushed nouvellement construite . Voici l'explication de la façon dont cela fonctionne et pourquoi je l'ai construit.