web-dev-qa-db-fra.com

UIBarButtonItem est désactivé, mais a une couleur normale

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?

14
Banana

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.

5
Banana

Swift 4

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)
25
Swift Hipster

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];
}
6
Abhishek Sharma

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)
2
Kyle Clegg

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:

 enter image description here

barTintColor = .white    
cancelButton.isEnabled = false
cancelButton.setTitleTextAttributes(
    [NSAttributedStringKey.foregroundColor: UIColor.orange], 
    for: UIControlState.disabled)
1
CodeBender

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)
0
tab67