Você pode subclassificar o UIButton e criar um bom forState.
colourButton.h
#import <UIKit/UIKit.h>
@interface colourButton : UIButton
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;
@end
colourButton.m
#import "colourButton.h"
@implementation colourButton
{
NSMutableDictionary *colours;
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self = [super initWithCoder:aDecoder];
// If colours does not exist
if(!colours)
{
colours = [NSMutableDictionary new]; // The dictionary is used to store the colour, the key is a text version of the ENUM
colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]] = (UIColor*)self.backgroundColor; // Store the original background colour
}
return self;
}
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state
{
// If it is normal then set the standard background here
if(state & UIControlStateNormal)
{
[super setBackgroundColor:backgroundColor];
}
// Store the background colour for that state
colours[[NSString stringWithFormat:@"%lu", state]]= backgroundColor;
}
-(void)setHighlighted:(BOOL)highlighted
{
// Do original Highlight
[super setHighlighted:highlighted];
// Highlight with new colour OR replace with orignial
if (highlighted && colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]])
{
self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateHighlighted]];
}
else
{
self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
}
}
-(void)setSelected:(BOOL)selected
{
// Do original Selected
[super setSelected:selected];
// Select with new colour OR replace with orignial
if (selected && colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]])
{
self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateSelected]];
}
else
{
self.backgroundColor = colours[[NSString stringWithFormat:@"%lu", UIControlStateNormal]];
}
}
@end
Notas (Este é um exemplo, eu sei que há problemas e aqui estão alguns)
Eu usei um NSMutableDictionay para armazenar o UIColor para cada estado, tenho que fazer uma conversão de texto desagradável para a chave, pois o UIControlState não é um bom int direto. Se você pudesse iniciar uma matriz com tantos objetos e usar o estado como um índice.
Por causa disso, muitos têm dificuldades com, por exemplo, um botão selecionado e desativado, é necessária alguma lógica.
Outro problema é que, se você tentar definir várias cores ao mesmo tempo, eu não tentei com um botão, mas se você puder fazer isso, pode não funcionar
[btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];
Eu assumi que este é o StoryBoard, não há init, initWithFrame, então adicione-os se precisar.