Możesz podklasować UIButton i zrobić niezły 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
Uwagi (To jest przykład, wiem, że są problemy i oto kilka)
Użyłem NSMutableDictionay do przechowywania UIColor dla każdego stanu, muszę zrobić nieprzyjemną konwersję tekstu dla klucza, ponieważ UIControlState nie jest ładną prostą int. Jeśli to tam możesz zainicjować tablicę z tyloma obiektami i użyć stanu jako indeksu.
Z tego powodu wielu ma trudności z np. Wybraniem i wyłączeniem przycisku, potrzeba nieco więcej logiki.
Kolejny problem polega na tym, że jeśli próbujesz ustawić wiele kolorów jednocześnie, nie próbowałem za pomocą przycisku, ale jeśli możesz to zrobić, może nie działać
[btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];
Zakładam, że to StoryBoard, nie ma init, initWithFrame, więc dodaj je, jeśli ich potrzebujesz.