UIButton title color change on highlight - How to turn it off?
Asked Answered
V

8

45

I have created a button. The title's color is black by default. But when I press it, the color changes to be a little blue and never changes back again, how does this happen? Can anyone tell me why? And I want the button's title remain black all the time. How can I do that? I have tried

[button setTitleColor:[UIColor darkTextColor] forState:UIControlStateHighlighted];
[button setTitleColor:[UIColor darkTextColor] forState:UIControlStateSelected];

But There is no effect. When I add this in my code, it seems the button's title always blue.

Code as follows.

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setFrame:CGRectMake(20, 360, 280, 44)];
[button setTitle:NSLocalizedString(@"Continue", @"Label: TextLabel in Continue button") forState:UIControlStateNormal];
button.titleLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size:20.0f];
button.titleLabel.textColor = [UIColor darkTextColor];
button.titleLabel.shadowColor = [UIColor blackColor];
button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin|UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin|UIViewAutoresizingFlexibleWidth;

[self.view addSubview:button];
[button release];

Thanks everyone. I have sloved the problem. I think the root cause is

button.titleLabel.textColor = [UIColor darkTextColor];

When I remove this, and use

button setTitleColor:(UIColor) forState:(UIControlState);

The problem is solved!

Voccola answered 23/10, 2012 at 12:57 Comment(4)
What method is this button linked to?Calpe
Do you want to disable the highlighting image? In Xib file, uncheck "highlight adjusts image".Lovellalovelock
So far I did not implement the related method.Voccola
Change the button type from "System" to "Custom" in your storyboard.Popinjay
W
54

you can use

[UIButton setTitleColor:forState:]

for all the states , then title color will remain same for all states.

[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
[button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
[button setTitleColor:[UIColor redColor] forState:UIControlStateSelected];

Note:To avoide type or paste above code three times you can use following code suggested by Will,

[button setTitleColor:[UIColor redColor] forState:(UIControlStateHighlighted | UIControlStateNormal | UIControlStateSelected)];
Wollastonite answered 23/10, 2012 at 13:27 Comment(8)
When I add these code, the title become always dark blue. I think this color is the default color of UIButton, but how can it change backVoccola
You can avoid typing or pasting all three lines by simply writing [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted & UIControlStateNormal & UIControlStateSelected];Skillful
@WillAndrew How do you use the & thing in Swift?Eyra
It's weird that nobody noticed it by now, but bitwise & will return 0 for the mentioned code, which means that's exactly as just writing UIControlStateNormal. The required bitwise operator is |: UIControlStateNormal | UIControlStateHighlighted | ...Nerine
currently this is wrong. Button saves different colors for different state values. for example UIControlStateSelected | UIControlStateHightLightted gives one concrete number value but UIControlStateSelected gives another concrete number value so, you should set color for differenet compositions of stateJessjessa
You have to change the button type from "System" to "Custom" in the storyboard to make it work!Lovato
This answer is misleading and simply wrong. Setting title color for composite state is not equivalent to setting title color for each single state separately.Comminate
In Swift you can simply do like this: button.setTitleColor(.yellow, for: [.normal, .highlighted, .selected])Leucocytosis
B
30

As @null points out, by far the simplest way to do this is to set the button type in Interface Builder (or in code) to "Custom".

If you need to replicate this behavior with a standard button, override the setHighlighted method to prevent the alpha channel of the titleLabel from adjusting too:

- (void)setHighlighted:(BOOL)highlighted
{
    [super setHighlighted:highlighted];
    self.titleLabel.alpha = 1.0;
}
Boast answered 4/6, 2014 at 23:50 Comment(3)
You should change the UIButton type from "System" to "Custom" it will do just that.Chapiter
But if you do like @remus said, before all your custom stuff, add [super setHighlighted:highlighted];Varityper
but this will cause it to briefly 'flash'Mylor
H
27

0 lines of code:

Using Interface Builder and either .XIB or .storyboard, select your UIButton in IB:
View > Utilities > Show Attributes Inspector.

Select State Config (Default) to one of Highlighted, Selected or Disabled and change the Text Color attribute.

Interface Builder solution

Hautbois answered 1/4, 2015 at 6:38 Comment(0)
W
5

There are a few comments pointing this out, but in order to have it as an actual answer:

Set the button type to Custom in your storyboard or in code: [UIButton buttonWithType:UIButtonTypeCustom];

Wilbertwilborn answered 28/6, 2016 at 19:14 Comment(0)
S
2

watch out, system will ignore setTitleColor(_:for:) if button is not type custom.

Slocum answered 19/11, 2019 at 15:10 Comment(0)
P
1

For something a little more reusable you might consider this, as it doesnt violate the DRY principle. Add this as a category on UIButton.

- (void)oka_setTitleColor:(UIColor *)color forStates:(NSArray *)states;
{
  [states enumerateObjectsUsingBlock:^(NSNumber *state, NSUInteger idx, BOOL *stop) {
    [self setTitleColor:color forState:[state integerValue]];
  }];
}

example usage for your case:

  [self oka_setTitleColor:[UIColor darkTextColor]
               forStates:@[@(UIControlStateNormal), @(UIControlStateHighlighted), @(UIControlStateSelected)]];
Prisoner answered 14/5, 2013 at 9:58 Comment(1)
I think the @WillAndrew's comment look better: [button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted & UIControlStateNormal & UIControlStateSelected];Paramagnetic
S
0

I think mayuur is right. Have you tried another color instead of "darkTextColor" though? As far as I know "darkTextColor" is a system specific color that is used to write Text on light backgrounds. Maybe try blackColor if mayuurs suggestion doesn't work.

Edit: Try adding: [sender setHighlighted:NO]; into your IBAction which is called on button press. Does it solve it? I suggest this because from the [button release]; I guess you're still running an old version of the iOs SDK and there you don't have the option to disable the highlight of a button in an elegant way other than this.

Edit2: You're creating the button programmatically but I don't see you connecting it with an IBAction. Add this below your [[UIButton alloc] init];

[button addTarget:self action:@selector(myIBAction) forControlEvents:UIControlEventTouchUpInside];

Then create an IBAction method like this:

- (IBAction)myIBAction:(UIButton *)sender; /* In Header File */

- (IBAction)myIBAction:(UIButton *)sender{ /* In Implementation File */
        [sender setHighlighted:NO];
}
Seale answered 23/10, 2012 at 13:6 Comment(6)
Is the button correctly hooked up to the IBAction? Could you add the IBAction to your question?Seale
I creat the button in my code, and use[button addTarget:self action:@selector(continueButtonPressed) forControlEvents:UIControlEventTouchDown];Voccola
I edited my answer. I think your method won't get called if you use "TouchDown" and just tap it quickly. Try using "UIControlEventTouchUpInside" instead.Seale
I think you have got a little misunderstanding. I mean the button's title color rather than the button's color. So I think there is no business of the Highlighted.Voccola
I also tried change the event to UIControlEventTouchUpInside, but it seems have no effectVoccola
I understood what you meant. :) - I ran in the same problem a few weeks ago but that solved it for me...Seale
A
0

You should initialize your button with UIButtonTypeCustom instead of UIButtonTypeRoundedRect

Allman answered 17/9, 2020 at 11:6 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.