objective c - type - Ist es möglich, die Hintergrundfarbe eines UIButtons zu ändern?




uiview ios (11)

Dieser hat mich ratlos gemacht.

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

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

Andere Möglichkeit:

  1. Erstellen Sie ein UIButton in Interface Builder.
  2. Geben Sie einen Typ "Benutzerdefiniert"
  3. Jetzt ist es in IB 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


Dies ist nicht so elegant wie UIButton Sub-Klasse, aber wenn Sie nur etwas schnell wollen - was ich getan habe, war benutzerdefinierte Schaltfläche erstellen, dann ein 1px mal 1px Bild mit der Farbe, die ich möchte, und den Hintergrund festlegen der Schaltfläche zu diesem Bild für den markierten Zustand - funktioniert für meine Bedürfnisse.


Eine andere Möglichkeit (die beste und schönste Imho):

Erstellen Sie ein UISegmentedControl mit 2 Segmenten in der erforderlichen Hintergrundfarbe in Interface Builder. Setzen Sie den Typ auf "bar". Dann ändern Sie es in nur ein Segment. Interface Builder akzeptiert kein Segment, also müssen Sie das programmatisch tun.

Erstellen Sie daher ein IBOutlet für diese Schaltfläche, und fügen Sie dieses der viewDidLoad Ihrer Ansicht hinzu:

[segmentedButton removeSegmentAtIndex:1 animated:NO];

Jetzt haben Sie einen schönen glänzenden, farbigen Knopf mit der spezifizierten Hintergrundfarbe. Verwenden Sie für Aktionen das Ereignis "Wert geändert".

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


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


Ich nehme an, Sie sprechen von einem UIButton mit UIButtonTypeRoundedRect ? Sie können die Hintergrundfarbe nicht ändern. Wenn Sie versuchen, seine Hintergrundfarbe zu ändern, ändern Sie eher die Farbe des Rechtecks, auf dem die Schaltfläche gezeichnet ist (was normalerweise klar ist). Also gibt es zwei Wege zu gehen. Entweder Sie Unterklasse UIButton und überschreiben Sie seine -drawRect: -Methode oder Sie erstellen Bilder für die verschiedenen Schaltflächen -drawRect: (was völlig in Ordnung ist).

Wenn Sie die Hintergrundbilder in Interface Builder festlegen, sollten Sie beachten, dass IB das Setzen von Bildern für alle Zustände, die die Schaltfläche haben kann, nicht unterstützt. Daher empfehle ich, die Bilder in folgendem Code zu setzen:

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 ein Bild für den ausgewählten & hervorgehobenen Zustand eingestellt wird (das ist der, den IB nicht einstellen kann). Sie brauchen die ausgewählten Bilder (Zeile 4 & 6) nicht, wenn Sie einen ausgewählten Status nicht benötigen.


Ich weiß, dass das vor langer Zeit gefragt wurde und jetzt gibt es ein neues UIButtonTypeSystem. Aber neuere Fragen werden als Duplikate dieser Frage markiert, also hier ist meine neuere Antwort im Kontext einer iOS 7-System-Taste, verwenden Sie die. .tintColor Eigenschaft.

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

Per @EthanB suggestion und @karim machen ein zurück gefülltes Rechteck, ich habe gerade eine Kategorie für den UIButton erstellt, um dies zu erreichen.

Geben Sie einfach den Kategoriecode ein: https://github.com/zmonteca/UIButton-PLColor

Verwendung:

[button setBackgroundColor:uiTextColor forState:UIControlStateDisabled];

Optional forStates zu verwenden:

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

Schnell 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)

Unterklasse UIButton und überschreiben setHighlighted und setSelected Methoden

-(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 DarkonShade-Methode ist in einer UIColor-Kategorie wie dieser

-(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];
}

UIButton Sie ein zweites Ziel für die UIButton für UIControlEventTouched und ändern Sie die UIButton Hintergrundfarbe. Ändern Sie es dann wieder in dem UIControlEventTouchUpInside Ziel;


Wenn Sie Bilder nicht verwenden möchten und genau wie im Rounded-Rect-Stil aussehen sollen, probieren Sie dies aus. Platzieren Sie einfach einen UIView über den UIButton, mit einem identischen Rahmen und einer automatischen Größenänderungsmaske, setzen Sie den Alpha auf 0.3 und setzen Sie den Hintergrund auf eine Farbe. Verwenden Sie dann das folgende Snippet, um die abgerundeten Kanten von der farbigen Überlagerungsansicht abzutrennen. Deaktivieren Sie außerdem das Kontrollkästchen "User Interaction Enabled" (Benutzerinteraktion aktiviert) in IB in der UIView, damit Berührungsereignisse auf die darunter liegende UIButton herabfallen können.

Ein Nebeneffekt ist, dass Ihr Text auch koloriert wird.

#import <QuartzCore/QuartzCore.h>

colorizeOverlayView.layer.cornerRadius = 10.0f;
colorizeOverlayView.layer.masksToBounds = YES;




uibutton