web-dev-qa-db-fra.com

Afficher/masquer la barre de navigation lorsque la vue est déplacée dans iOS 8

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?

21
nebuto

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
}
12
Nick Wargnier

Je pensais que la ligne est:

self.navigationController.navigationBar.hidden = YES;

Je vérifie et cela fonctionne bien pour moi. . . Essayez. . .

9
iHart

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];
}
8
Patrick Haaser

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

7
de-bits

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é.

4

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.

0
gontovnik