44 votes

Le bouton iOS UINavigationBar reste effacé après le retour

Dans mon application j'ai plusieurs contrôleurs de vue, et la plupart ont un côté droit UIBarButtonItem direct avec le "show" des enchaînements d'actions attachés.

Avoir s'est alors tourné vers un autre point de vue, puis pressé '< Back' bouton, le bouton d'origine de l'élément reste disparu, bien qu'encore sinon utilisable.

Cela ne semble se produire sous iOS 11.2.

Je ne peux pas voir tout paramètre qui pourrait faire cela, et dans au moins un des cas où cela arrive, il n'y a aucune séquence de déroulement, ni viewDidAppear de la manipulation. J'avais poster du code, mais AFAICS c'est tout juste valeur par défaut UINavigationBar comportement.

37voto

Tamás Sengel Points 25414

C'est un bug dans iOS 11.2 et se produit parce que l' UIBarButtonItem des séjours mis en évidence après la navigation et de ne pas revenir à son état normal après l'autre point de vue, contrôleur de la pop.

Pour éviter ce comportement, soit

  1. utiliser un UIBarButtonItem avec un UIButton comme un affichage personnalisé

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

    barButtonItem.isEnabled = false
    barButtonItem.isEnabled = true
    

24voto

matt Points 60113

Ce que je fais est de contourner ce bogue, dans 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.

5voto

microbee Points 61

Une autre solution consiste à implémenter le correctif sur navigationController parent - de sorte que chacun de ses enfants viewController obtienne le correctif comme suit

REMARQUE: La classe de réception doit être 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;
    }
}
 

2voto

Alex Balan Points 61

Je l'ai résolu comme ça:

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

de sorte qu'il restaure la couleur avant que l'autre vue n'apparaisse

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X