J'ai un problème avec un UIBarButtonItem
. J'utilise le proxy d'apparence pour définir sa couleur pour les états Normal
et Disabled
et je le fais dans la méthode viewDidLoad
de UIViewController
. Cependant, le bouton prend la couleur Normal
, même lorsqu'il est désactivé (et il est définitivement désactivé car la méthode IBAction
n'est pas appelée).
La question est similaire à celle-ci la couleur du texte de uibarbuttonitem désactivé est toujours la couleur de l'état normal , cependant, la solution affichée ici ne fonctionne pas pour moi.
Mon application est pour iOS 8.2 et j'utilise Xcode 6.2
Des idées?
EDIT: Je ne suis pas sûr que cela soit utile pour trouver la solution, mais lorsque je crée mon bouton en utilisant initWithImage:
au lieu de initWithTitle:
, tout semble bien fonctionner. Serait-ce un bug Apple?
J'ai donc finalement réussi à faire fonctionner ce système comme il se doit, et le problème était que je définissais la couleur de UIBarButtonItems à deux reprises, une fois avec [navBar setTintColor:] et une fois avec l'apparence proxy. Laisser simplement le proxy d'apparence résout le problème.
Si quelqu'un cherche comment modifier l'état d'apparition de l'état désactivé dans uibarbuttonitem dans Swift. Voici.
barButtonItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.lightGray], for: .disabled)
Vérifiez auprès de code
suivant.
- (void)viewDidLoad {
[super viewDidLoad];
UIBarButtonItem * btnTemp = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(btnDone_Click:)];
[btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor lightGrayColor], NSFontAttributeName:[UIFont boldSystemFontOfSize:16.0f]} forState:UIControlStateNormal];
[btnTemp setTitleTextAttributes:@{NSForegroundColorAttributeName : [UIColor blueColor], NSFontAttributeName:[UIFont systemFontOfSize:16.0f]} forState:UIControlStateDisabled];
[self.navigationItem setRightBarButtonItem:btnTemp];
}
- (void)btnDone_Click : (id)sender {
UIBarButtonItem * button = (UIBarButtonItem *)sender;
[button setEnabled:FALSE];
[self performSelector:@selector(enableButton:) withObject:sender afterDelay:2.0f];
}
- (void)enableButton : (id)sender {
UIBarButtonItem * button = (UIBarButtonItem *)sender;
[button setEnabled:TRUE];
}
Vous avez probablement défini les attributs de texte de titre d'élément de bouton de barre pour l'état .Normal
et vous devez également le définir pour l'état .Disabled
.
Il existe deux manières de résoudre ce problème, l'une si vous définissez les attributs de texte du titre sur l'instance d'élément de bouton de barre et l'autre si vous utilisez le proxy d'apparence.
Seule instance:
saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)
Apparence proxy:
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([MyNavigationController.self]).setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)
Ceci met à jour la réponse pour Swift 4.0 :
barButtonItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.gray], for: UIControlState.disabled)
Ceci montre un exemple illustratif de couleur orange pour les personnes handicapées par rapport à un blanc barTintColor:
barTintColor = .white
cancelButton.isEnabled = false
cancelButton.setTitleTextAttributes(
[NSAttributedStringKey.foregroundColor: UIColor.orange],
for: UIControlState.disabled)
C’était aussi mon problème, lors de l’exécution sur les versions iOS 10. *. Définir la couleur de premier plan du bouton a résolu le problème pour moi.
self.saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.gray], for: UIControlState.disabled)