Sie können den UIButton unterordnen und einen schönen forState erstellen.
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
Anmerkungen (Dies ist ein Beispiel, ich weiß, dass es Probleme gibt und hier sind einige)
Ich habe einen NSMutableDictionay verwendet, um die UIColor für jeden Status zu speichern. Ich muss eine unangenehme Textkonvertierung für den Schlüssel durchführen, da der UIControlState kein netter Straight Int ist. Wenn Sie ein Array mit so vielen Objekten initiieren und den Status als Index verwenden könnten.
Aus diesem Grund haben Sie viele Schwierigkeiten, z. B. mit einer ausgewählten und deaktivierten Schaltfläche. Es ist etwas mehr Logik erforderlich.
Ein weiteres Problem ist, wenn Sie versuchen, mehrere Farben gleichzeitig einzustellen. Ich habe es nicht mit einer Schaltfläche versucht, aber wenn Sie dies tun können, funktioniert es möglicherweise nicht
[btn setBackgroundColor:colour forState:UIControlStateSelected & UIControlStateHighlighted];
Ich habe angenommen, dass dies StoryBoard ist, es gibt kein init, initWithFrame, also füge sie hinzu, wenn du sie brauchst.