I'm having an issue with a UIBarButtonItem
. I use the appearance proxy to set its color for states Normal
and Disabled
and I do this in the viewDidLoad
method of the UIViewController
. However, the button gets the Normal
color, even when it is disabled (and it is definitely disabled because the IBAction
method is not being called).
The question is similar to this one text color of disabled uibarbuttonitem is always the color of the normal state, however, the solution posted here does not work for me.
My app is for iOS 8.2 and I'm using Xcode 6.2
Any ideas?
EDIT:
I am not sure if this is helpful for finding the solution, but when I create my button using initWithImage:
instead of initWithTitle:
everything seems to be working well. Could this be an Apple bug?
If someone looking for how to change barbuttonitem disabled state appearance in swift. Here you go.
barButtonItem.setTitleTextAttributes([NSAttributedString.Key.foregroundColor: UIColor.lightGray], for: .disabled)
Check with following code
.
- (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];
}
So I finally managed to get this working as it should, and the problem was that I was setting the color of UIBarButtonItems twice, once using [navBar setTintColor:] and once using the appearance proxy. Leaving just the appearance proxy solves the problem.
You have likely set the bar button item title text attributes for the .Normal
state and need to also set it for the .Disabled
state.
There are two ways to fix this, one if you are setting the title text attributes on the bar button item instance and in the other case if you use the appearance proxy.
Single instance:
saveButton.setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)
Appearance proxy:
UIBarButtonItem.appearanceWhenContainedInInstancesOfClasses([MyNavigationController.self]).setTitleTextAttributes([NSForegroundColorAttributeName: UIColor.grayColor()], forState: .Disabled)
This updates the answer for Swift 4.0:
barButtonItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor: UIColor.gray], for: UIControlState.disabled)
This shows an illustrative example of an orange color for disabled against a white barTintColor:
barTintColor = .white
cancelButton.isEnabled = false
cancelButton.setTitleTextAttributes(
[NSAttributedStringKey.foregroundColor: UIColor.orange],
for: UIControlState.disabled)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With