web-dev-qa-db-ger.com

Kann man die Hintergrundfarbe eines UIButtons ändern?

Dieser hat mich verblüfft.

Ist es möglich, die Hintergrundfarbe eines UIButton in Cocoa for iPhone zu ändern? Ich habe versucht, die Hintergrundfarbe einzustellen, ändert aber nur die Ecken. setBackgroundColor: scheint die einzige für solche Dinge verfügbare Methode zu sein.

[random setBackgroundColor:[UIColor blueColor]];
[random.titleLabel setBackgroundColor:[UIColor blueColor]];
105
dubbeat

Dies kann programmgesteuert durch Erstellen einer Replik erfolgen:

    loginButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [loginButton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    loginButton.backgroundColor = [UIColor whiteColor];
    loginButton.layer.borderColor = [UIColor blackColor].CGColor;
    loginButton.layer.borderWidth = 0.5f;
    loginButton.layer.cornerRadius = 10.0f;

edit: ofcourse, müsstest du #import <QuartzCore/QuartzCore.h>

bearbeiten: Für alle neuen Leser sollten Sie einige Optionen als "andere Möglichkeit" in Betracht ziehen. für deine Rücksichtnahme.

Da dies eine alte Antwort ist, empfehle ich dringend, die Kommentare zur Fehlerbehebung zu lesen

158
Stian Storrvik

Ich habe einen anderen Ansatz,

[btFind setTitle:NSLocalizedString(@"Find", @"") forState:UIControlStateNormal];    
[btFind setBackgroundImage:[CommonUIUtility imageFromColor:[UIColor cyanColor]] 
        forState:UIControlStateNormal];
btFind.layer.cornerRadius = 8.0;
btFind.layer.masksToBounds = YES;
btFind.layer.borderColor = [UIColor lightGrayColor].CGColor;
btFind.layer.borderWidth = 1;

Von CommonUIUtility aus

+ (UIImage *) imageFromColor:(UIColor *)color {
    CGRect rect = CGRectMake(0, 0, 1, 1);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    //  [[UIColor colorWithRed:222./255 green:227./255 blue: 229./255 alpha:1] CGColor]) ;
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

Vergessen Sie nicht, #import <QuartzCore/QuartzCore.h>

59
karim

Ich nehme an, Sie sprechen von einem UIButton mit UIButtonTypeRoundedRect? Sie können die Hintergrundfarbe nicht ändern. Wenn Sie versuchen, die Hintergrundfarbe zu ändern, ändern Sie eher die Farbe des Rekts, auf dem die Schaltfläche gezeichnet ist (was normalerweise klar ist). Es gibt zwei Möglichkeiten. Entweder Sie unterteilen die UIButton-Klasse und überschreiben ihre -drawRect:-Methode, oder Sie erstellen Bilder für die verschiedenen Schaltflächenzustände (was durchaus in Ordnung ist).

Wenn Sie die Hintergrundbilder im Interface Builder festlegen, sollten Sie beachten, dass IB die Einstellung von Bildern für alle Status der Schaltfläche nicht unterstützt. Ich empfehle daher, die Bilder im Code wie folgt festzulegen:

UIButton *myButton = [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setBackgroundImage:[UIImage imageNamed:@"normal.png"] forState:UIControlStateNormal];
[myButton setBackgroundImage:[UIImage imageNamed:@"disabled.png"] forState:UIControlStateDisabled];
[myButton setBackgroundImage:[UIImage imageNamed:@"selected.png"] forState:UIControlStateSelected];
[myButton setBackgroundImage:[UIImage imageNamed:@"higligted.png"] forState:UIControlStateHighlighted];
[myButton setBackgroundImage:[UIImage imageNamed:@"highlighted+selected.png"] forState:(UIControlStateHighlighted | UIControlStateSelected)];

Die letzte Zeile zeigt, wie Sie ein Bild für den ausgewählten & hervorgehobenen Status einstellen können (dies ist derjenige, den IB nicht einstellen kann). Ich brauche einen ausgewählten Zustand.

32
stigi

Andere Möglichkeit:

  1. Erstellen Sie einen UIButton im Interface-Builder.
  2. Gib einen Typ "Benutzerdefiniert"
  3. In IB ist es jetzt möglich, die Hintergrundfarbe zu ändern

Der Knopf ist jedoch quadratisch, und das wollen wir nicht. Erstellen Sie ein IBOutlet mit einem Verweis auf diese Schaltfläche, und fügen Sie der viewDidLoad-Methode Folgendes hinzu:

[buttonOutlet.layer setCornerRadius:7.0f];
[buttonOutlet.layer setClipToBounds:YES];

Vergessen Sie nicht, QuartzCore.h zu importieren

28
wubbe

Unterklasse UIButton und überschreiben die Methoden setHighlighted und setSelected

-(void) setHighlighted:(BOOL)highlighted {

  if(highlighted) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setHighlighted:highlighted];
}

-(void) setSelected:(BOOL)selected {

  if(selected) {
    self.backgroundColor = [self.mainColor darkerShade];
  } else {
    self.backgroundColor = self.mainColor;
  }
  [super setSelected:selected];
}

Meine darkerShade-Methode befindet sich in einer solchen UIColor-Kategorie

-(UIColor*) darkerShade {

  float red, green, blue, alpha;
  [self getRed:&red green:&green blue:&blue alpha:&alpha];

  double multiplier = 0.8f;
  return [UIColor colorWithRed:red * multiplier green:green * multiplier blue:blue*multiplier alpha:alpha];
}
17
Mugunth

colored UIButton

Wenn Sie keine Bilder verwenden möchten und es so aussehen soll, dass es genau dem Rounded Rect-Stil entspricht, versuchen Sie dies. Platzieren Sie einfach einen UIView über dem UIButton mit einem identischen Rahmen und einer Maske zur automatischen Größenänderung, setzen Sie das Alpha auf 0,3 und setzen Sie den Hintergrund auf eine Farbe. Verwenden Sie dann den folgenden Ausschnitt, um die abgerundeten Kanten aus der farbigen Overlay-Ansicht herauszuschneiden. Deaktivieren Sie außerdem das Kontrollkästchen "User Interaction Enabled" (Benutzerinteraktion aktiviert) in der UIView, um zuzulassen, dass Berührungsereignisse auf den darunter liegenden UIButton herunterfallen. 

Ein Nebeneffekt ist, dass Ihr Text auch eingefärbt wird.

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;
7
Jacob Jennings

Eine andere Möglichkeit (das beste und schönste imho):

Erstellen Sie ein UISegmentedControl mit 2 Segmenten in der erforderlichen Hintergrundfarbe im Interface Builder. Setzen Sie den Typ auf 'bar'. Ändern Sie dann, um nur ein Segment zu haben. Interface Builder akzeptiert kein Segment, daher müssen Sie dies programmgesteuert tun.

Erstellen Sie daher ein IBOutlet für diese Schaltfläche und fügen Sie dies dem viewDidLoad Ihrer Ansicht hinzu:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

Jetzt haben Sie eine schöne glänzende, farbige Schaltfläche mit der angegebenen Hintergrundfarbe. Verwenden Sie für Aktionen das Ereignis 'value changes'.

(Ich habe dies auf http://chris-software.com/index.php/2009/05/13/creating-a-Nice-glass-buttons/ gefunden. Danke Chris!

7
wubbe

Nun, ich bin zu 99% positiv, dass Sie nicht einfach die Hintergrundfarbe eines UIButton ändern können. Stattdessen musst du die Hintergrundbilder selbst ändern, was ich für einen Schmerz halte. Ich bin erstaunt, dass ich das tun musste.

Wenn ich falsch liege oder es einen besseren Weg gibt, ohne Hintergrundbilder einstellen zu müssen, lass es mich wissen

[random setBackgroundImage:[UIImage imageNamed:@"toggleoff.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor darkTextColor] forState:UIControlStateNormal];


[random setBackgroundImage:[UIImage imageNamed:@"toggleon.png"] forState:UIControlStateNormal];
    [random setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
5
dubbeat

Mit @EthanB-Vorschlag und @karim beim Erstellen eines rückseitigen Rechtecks ​​habe ich gerade eine Kategorie für den UIButton erstellt, um dies zu erreichen. 

Füge einfach den Kategorie-Code ein: https://github.com/zmonteca/UIButton-PLColor

Verwendungszweck:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

Optionale zu verwendende Staaten:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
2
zmonteca

Sie können der Schaltfläche auch einen CALayer hinzufügen. Mit dieser Funktion können Sie eine Reihe von Optionen einschließlich einer Farbüberlagerung ausführen. In diesem Beispiel wird eine Ebene mit einfachen Farben verwendet, mit der Sie die Farbe auch problemlos stufen können. Seien Sie sich bewusst, dass hinzugefügte Ebenen die darunter liegenden verdecken

+(void)makeButtonColored:(UIButton*)button color1:(UIColor*) color
{

    CALayer *layer = button.layer;
    layer.cornerRadius = 8.0f;
    layer.masksToBounds = YES;
    layer.borderWidth = 4.0f;
    layer.opacity = .3;//
    layer.borderColor = [UIColor colorWithWhite:0.4f alpha:0.2f].CGColor;

    CAGradientLayer *colorLayer = [CAGradientLayer layer];
    colorLayer.cornerRadius = 8.0f;
    colorLayer.frame = button.layer.bounds;
    //set gradient colors
    colorLayer.colors = [NSArray arrayWithObjects:
                         (id) color.CGColor,
                         (id) color.CGColor,
                         nil];

    //set gradient locations
    colorLayer.locations = [NSArray arrayWithObjects:
                            [NSNumber numberWithFloat:0.0f],
                            [NSNumber numberWithFloat:1.0f],
                            nil];


    [button.layer addSublayer:colorLayer];

}
2
gheese

fügen Sie für UIButton ein zweites Ziel für UIControlEventTouched hinzu und ändern Sie die Hintergrundfarbe UIButton. Dann ändere es wieder im UIControlEventTouchUpInside-Ziel.

1
Shaun

Ich weiß, dass dies vor langer Zeit gefragt wurde, und jetzt gibt es ein neues UIButtonTypeSystem. Neuere Fragen werden jedoch als Duplikate dieser Frage markiert. Hier ist meine neuere Antwort im Kontext einer iOS 7-Systemschaltfläche. Verwenden Sie die .tintColor-Eigenschaft. 

let button = UIButton(type: .System)
button.setTitle("My Button", forState: .Normal)
button.tintColor = .redColor()
1
DonnaLea

Dies ist nicht so elegant wie das Unterteilen von UIButton. Wenn Sie jedoch nur etwas schnelles wollen, erstellen Sie einen benutzerdefinierten Button. Dann wird ein 1 x 1 x großes Bild mit der gewünschten Farbe erstellt und der Hintergrund festgelegt von der Schaltfläche zu diesem Bild für den hervorgehobenen Zustand - funktioniert für meine Bedürfnisse.

1
SMSidat

Für professionelle und gut aussehende Schaltflächen können Sie diese benutzerdefinierte Schaltflächenkomponente markieren. Sie können es direkt in Ihren Ansichten und Tabellenansichten verwenden oder den Quellcode so ändern, dass er Ihren Anforderungen entspricht. Hoffe das hilft.

1
Ahmet Ardal

Swift 3:

        static func imageFromColor(color: UIColor, width: CGFloat, height: CGFloat) -> UIImage {
            let rect = CGRect(x: 0, y: 0, width: width, height: height)
            UIGraphicsBeginImageContext(rect.size)
            let context = UIGraphicsGetCurrentContext()!
            context.setFillColor(color.cgColor)
            context.fill(rect)
            let img = UIGraphicsGetImageFromCurrentImageContext()!
            UIGraphicsEndImageContext()
            return img
        }

        let button = UIButton(type: .system)
        let image = imageFromColor(color: .red, width: 
        button.frame.size.width, height: button.frame.size.height)
        button.setBackgroundImage(image, for: .normal)
0
pawurb

[myButton setBackgroundColor:[UIColor blueColor]]; [myButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];

Es ist möglich, diesen Weg zu ändern oder das Storyboard aufzurufen und den Hintergrund der Optionen auf der rechten Seite zu ändern.

0