Ви можете підкласифікувати UIButton і зробити приємне дляState.
colourButton.h
#import <UIKit/UIKit.h>
@interface colourButton : UIButton
-(void)setBackgroundColor:(UIColor *)backgroundColor forState:(UIControlState)state;
@end
colorurButton.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
Примітки (Це приклад, я знаю, що є проблеми, і ось деякі)
Я використовував NSMutableDictionay для зберігання UIColor для кожного штату, я повинен зробити неприємне перетворення тексту для ключа, оскільки UIControlState не є хорошим прямим Int. Якби там, де ви могли б ініціювати масив із такою кількістю об'єктів і використовувати стан як індекс.
Через це у багатьох виникають труднощі з, наприклад, вибраною кнопкою та відключеною кнопкою, потрібна ще якась логіка.
Інша проблема полягає в тому, що якщо ви спробуєте встановити кілька кольорів одночасно, я не намагався натиснути кнопку, але якщо ви можете це зробити, це може не спрацювати
[btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];
Я припустив, що це StoryBoard, немає init, initWithFrame, тому додайте їх, якщо вони вам потрібні.