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
.
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
utiliser un UIBarButtonItem
avec un UIButton
comme vue personnalisée
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
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.
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;
}
}
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