web-dev-qa-db-fra.com

Le bouton iOS UINavigationBar reste fané après le retour de la séquence

Dans mon application, j'ai plusieurs contrôleurs de vue, et la plupart ont un UIBarButtonItem à droite avec des actions de séquence "show" directes attachées.

Après avoir accédé à une autre vue, puis appuyé sur la touche '< Back', l'élément de bouton d'origine reste effacé, bien qu'il soit toujours utilisable.

Cela ne semble se produire que sous iOS 11.2.

Je ne vois aucun paramètre qui pourrait faire cela, et dans au moins un des cas où cela se produit, il n'y a pas de déroulement de séquence spécifique ni de gestion de viewDidAppear. Je publierais du code, mais AFAICS, c'est tout simplement le comportement par défaut UINavigationBar.

44
Alnitak

Il s'agit d'un bogue dans iOS 11.2 qui se produit car le UIBarButtonItem reste mis en surbrillance après la navigation et ne revient pas à son état normal une fois que l'autre contrôleur de vue apparaît.

Pour éviter ce comportement, soit

  1. utiliser un UIBarButtonItem avec un UIButton comme vue personnalisée

  2. désactiver et réactiver l'élément de bouton de barre dans viewWillDisappear(_:) (bien que cela fasse apparaître le bouton immédiatement, utilisez la solution de matt pour éviter cela):

     barButtonItem.isEnabled = false 
     barButtonItem.isEnabled = true 
    
38
Tamás Sengel

Ce que je fais, c'est contourner ce bogue, dans le viewWillAppear du contrôleur de vue, comme suit:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    self.navigationController?.navigationBar.tintAdjustmentMode = .normal
    self.navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

Cela semble réveiller le bouton sans artefacts visuels.

24
matt

Un autre travail consiste à implémenter le correctif sur le parent navigationController - afin que chacun de ses enfants viewController obtienne le correctif comme suit

REMARQUE: cela nécessite que la classe réceptrice soit configurée en tant que délégué UINavigationController

rapide

func navigationController(_ navigationController: UINavigationController, willShow viewController: UIViewController, animated: Bool) {
    if #available(iOS 11.2, *) {
        navigationBar.tintAdjustmentMode = .normal
        navigationBar.tintAdjustmentMode = .automatic
    }
}

Objectif-C

-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {    
    if (@available(iOS 11.2, *)) {
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
        self.navigationBar.tintAdjustmentMode = UIViewTintAdjustmentModeAutomatic;
    }
}
5
microbee

Je l'ai résolu comme ceci:

override func viewWillDisappear(_ animated: Bool) {
    navigationController?.navigationBar.tintAdjustmentMode = .normal
    navigationController?.navigationBar.tintAdjustmentMode = .automatic
}

il restituera donc la couleur avant que l'autre vue n'apparaisse

2
Alex Balan