Deaktivierter UIButton nicht ausgeblendet oder grau


135

In meiner iPhone-App habe ich einen UIButton, den ich in Interface Builder erstellt habe. Ich kann es so erfolgreich in meinem Code aktivieren und deaktivieren ...

sendButton.enabled = YES;

oder

sendButton.enabled = NO;

Das optische Erscheinungsbild der Schaltfläche ist jedoch immer gleich! Es ist nicht verblasst oder grau. Wenn ich jedoch versuche, darauf zu klicken, wird es wie erwartet aktiviert oder deaktiviert. Vermisse ich etwas Sollte es nicht verblasst oder grau aussehen?


Verwenden Sie ein Bild mit Ihrem UIButton?
Jhaliya

Nein, das ist nicht der Fall. Sie müssen das Alpha einstellen. Dementsprechend funktioniert es.
Ravin

Antworten:


187

Sie können folgenden Code verwenden:

sendButton.enabled = YES;
sendButton.alpha = 1.0;

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;

12
Das funktioniert zwar rechne ich Lösungen, die das Aussehen je nach Steuerzustand wie verändern diese und dies eine viel bessere Idee von unten ist. Sie verwenden den integrierten Mechanismus, um eine automatische Änderung zu erreichen, anstatt das Erscheinungsbild des Steuerelements je nach Status explizit aktualisieren zu müssen.
Benjohn

78

Ändern Sie einfach die Statuskonfiguration in "Deaktivieren" und wählen Sie das gewünschte Hintergrundbild für den deaktivierten Status aus

Geben Sie hier die Bildbeschreibung ein


13
Dadurch werden nur die Eigenschaften in der Unterüberschrift " Schaltfläche" geändert . Die Hintergrundfarbe befindet sich unter der Unterüberschrift Ansicht und wird daher nicht durch Statuskonfigurationen geändert.
Hunter Monk

2
Dies funktioniert nicht für die Hintergrundfarbe der Ansicht. In meinem Projekt habe ich die vorherige Antwort und diese kombiniert.
Anton

40

Eine andere Möglichkeit besteht darin, die Textfarbe (z. B. hellgrau) für den deaktivierten Status zu ändern.

Wählen Sie im Storyboard-Editor Disabledaus der State ConfigPopup-Schaltfläche. Verwenden Sie dieText Color Popup-Schaltfläche, um die Textfarbe zu ändern.

Verwenden Sie im Code die -setTitleColor:forState:Nachricht.


Dies scheint eine viel bessere Lösung zu sein als die ausgenommene Antwort, das Alpha anzupassen. Ich hatte dies bereits vor Monaten abgestimmt und jetzt bin ich mit dem gleichen Problem wieder hier. Ich wünschte, ich könnte es wieder tun!
Benjohn

Ja, scheint eine funktionierende Lösung zu sein. Ich benutze nur die hellgraue Farbe.
Atereshkov

23

Versuchen Sie, die verschiedenen Bilder für UIControlStateDisabled(deaktiviertes graues Bild) und UIControlStateNormal(normales Bild) so einzustellen, dass die Schaltfläche den deaktivierten Status für Sie generiert.


2
Er verwendet keine Bilder - aber Sie könnten das gleiche Konzept anwenden [ UIButton setAttributedTitle:forState:]. Erstellen Sie Ihre zugewiesene Zeichenfolge, bei der Ihre Textvordergrundfarbe auf eine transparente Farbe eingestellt ist.
Nielsbot

20

Damit die Schaltfläche beim Deaktivieren ausgeblendet wird, können Sie Alpha dafür festlegen. Es gibt zwei Möglichkeiten für Sie:

Erster Weg : Wenn Sie alle Ihre Schaltflächen in Ihrer App beantragen möchten, können Sie extensionfür UIButton wie folgt schreiben :

extension UIButton {

    open override var isEnabled: Bool{
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }

}

Zweiter Weg : Wenn Sie nur einige Schaltflächen in Ihrer App beantragen möchten, können Sie eine benutzerdefinierte Klasse aus UIButton wie unten schreiben und diese Klasse verwenden, für die Sie sich bewerben möchten:

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}

13

Wenn Sie eine Textschaltfläche verwenden, können Sie die Instanzmethode in viewDidLoad einfügen

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state

Beispiel:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];

1
Dies sollte die akzeptierte Antwort für eine Textschaltfläche sein. Die aktuell akzeptierte Antwort ist gut für eine Bildschaltfläche. Was ich aus den Kommentaren von op bekomme, ist, dass er einen
Ali Hus

11

Sie können verwenden, adjustsImageWhenDisabledwas Eigentum von istUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ex:

 Button.adjustsImageWhenDisabled = false

2
Was macht das? Können Sie erklären, warum er das benutzen sollte?
Zippy

7

Dies ist eine ziemlich alte Frage, aber es gibt einen sehr einfachen Weg, dies zu erreichen.

myButton.userInteractionEnabled = false

Dadurch werden nur Berührungsgesten deaktiviert, ohne dass das Erscheinungsbild der Schaltfläche geändert wird


5

In Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

oder

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

5

Set title colorfür verschiedene Zustände:

@IBOutlet weak var loginButton: UIButton! {
        didSet {
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 0.3), for: .disabled)
            loginButton.setTitleColor(UIColor.init(white: 1, alpha: 1), for: .normal)
        }
    }

Verwendung: (Die Textfarbe ändert sich automatisch.)

loginButton.isEnabled = false

Geben Sie hier die Bildbeschreibung ein


3

Erstellen Sie eine Erweiterung in Swift> 3.0 und nicht jede Schaltfläche für sich

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}

3

Sie können die beiden ersten Antworten verwenden und erhalten ein besseres Ergebnis.

Ändern Sie im Attributinspektor (wenn Sie die Schaltfläche auswählen) die Statuskonfiguration in Deaktiviert, um das neue Bild festzulegen, das angezeigt wird, wenn es deaktiviert wird (entfernen Sie die Markierung in der Prüfung Inhalt-> Aktiviert, um es zu deaktivieren). .

Wenn Sie den Status in "Aktiviert" ändern, wird das Image aus diesem Status geladen.

Das Hinzufügen der Alpha-Logik ist ein gutes Detail.


3

Swift 4+

extension UIButton {
    override open var isEnabled: Bool {
        didSet {
            DispatchQueue.main.async {
                if self.isEnabled {
                    self.alpha = 1.0
                }
                else {
                    self.alpha = 0.6
                }
            }
        }
    }
}

Wie benutzt man

myButton.isEnabled = false

2

Ich bin auf das gleiche Problem fixiert. Das Einstellen von Alpha ist nicht das, was ich will.

UIButtonhat " Hintergrundbild " und " Hintergrundfarbe ". Für Bild UIButtonhat eine Eigenschaft als

@property (nonatomic) BOOL adjustsImageWhenDisabled

Das Hintergrundbild wird heller gezeichnet, wenn die Schaltfläche deaktiviert ist. Für die Hintergrundfarbe funktioniert die Einstellung von Alpha, Ravins Lösung, einwandfrei.

Zuerst müssen Sie überprüfen, ob Sie das Kontrollkästchen "Deaktiviert passt Bild" unter Dienstprogrammattribute deaktiviert haben.
Überprüfen Sie dann die Hintergrundfarbe für diese Schaltfläche.

(Hoffe, es ist hilfreich. Dies ist ein alter Beitrag; möglicherweise haben sich die Dinge in Xcode geändert.)


1

Es sieht so aus, als ob der folgende Code gut funktioniert. In einigen Fällen funktioniert dies jedoch nicht.

sendButton.enabled = NO;
sendButton.alpha = 0.5;

Wenn der obige Code nicht funktioniert, wickeln Sie ihn bitte in den Haupt-Thread ein. so

dispatch_async(dispatch_get_main_queue(), ^{
    sendButton.enabled = NO;
    sendButton.alpha = 0.5
});

wenn Sie mit schnell gehen, so

DispatchQueue.main.async {
    sendButton.isEnabled = false
    sendButton.alpha = 0.5
}

Wenn Sie UIButton angepasst haben, fügen Sie dies der Button-Klasse hinzu.

override var isEnabled: Bool {
    didSet {
        DispatchQueue.main.async {
            if self.isEnabled {
                self.alpha = 1.0
            }
            else {
                self.alpha = 0.5
            }
        }
    }
}

Vielen Dank und viel Spaß beim Codieren !!!


1

Wenn sich das UIButtonim kombinierten Zustand von selectedund befindet disabled, ist sein ZustandUIControlStateSelected | UIControlStateDisabled .

Der Zustand muss also folgendermaßen angepasst werden:

[button setTitleColor:color UIControlStateSelected | UIControlStateDisabled];
[button setImage:image forState:UIControlStateSelected | UIControlStateDisabled];

Ein Ansatz besteht darin, die Unterklasse UIButtonwie folgt zu unterteilen:

@implementation TTButton
- (void)awakeFromNib {
   [super awakeFromNib];

    //! Fix behavior when `disabled && selected`
    //! Load settings in `xib` or `storyboard`, and apply it again.
    UIColor *color = [self titleColorForState:UIControlStateDisabled];
    [self setTitleColor:color forState:UIControlStateDisabled];

    UIImage *img = [self imageForState:UIControlStateDisabled];
    [self setImage:img forState:UIControlStateDisabled];
}

- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state {
    [super setTitleColor:color forState:state];

    //
    if (UIControlStateDisabled == state) {
        [super setTitleColor:color forState:UIControlStateSelected | state];
        [super setTitleColor:color forState:UIControlStateHighlighted | state];
    }
}

- (void)setImage:(UIImage *)image forState:(UIControlState)state {
    [super setImage:image forState:state];

    if (UIControlStateDisabled == state) {
        [super setImage:image forState:UIControlStateSelected | state];
        [super setImage:image forState:UIControlStateHighlighted | state];
    }
}

@end

1
Dies sollte die akzeptierte Antwort sein. Auf Swift benötigen Sie so etwas wie setTitleColor (disabledColor, für: [.disabled, .selected])
Paulo Cesar

0

Diese Frage hat viele Antworten, aber alle sehen nicht sehr nützlich aus, wenn Sie wirklich backgroundColor verwenden möchten, um Ihre Schaltflächen zu gestalten. UIButton hat eine nette Option, um verschiedene Bilder für verschiedene Steuerzustände festzulegen, aber es gibt nicht die gleiche Funktion für Hintergrundfarben. Eine der Lösungen besteht darin, eine Erweiterung hinzuzufügen, die Bilder aus Farbe generiert und auf die Schaltfläche anwendet.

extension UIButton {
  private func image(withColor color: UIColor) -> UIImage? {
    let rect = CGRect(x: 0.0, y: 0.0, width: 1.0, height: 1.0)
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()

    context?.setFillColor(color.cgColor)
    context?.fill(rect)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    return image
  }

  func setBackgroundColor(_ color: UIColor, for state: UIControlState) {
    self.setBackgroundImage(image(withColor: color), for: state)
  }
}

Nur ein Problem mit dieser Lösung: Diese Änderung wird nicht auf Schaltflächen angewendet, die im Storyboard erstellt wurden. Für mich ist dies kein Problem, da ich die Benutzeroberfläche lieber aus Code formatiere. Wenn Sie Storyboards verwenden möchten, dann etwas zusätzliche Magie mit@IBInspectable erforderlich.

Die zweite Option ist die Unterklasse, aber ich ziehe es vor, dies zu vermeiden.


0

Möglicherweise können Sie Ihre Schaltfläche in Unterklassen unterteilen und Ihre isEnabled-Variable überschreiben. Der Vorteil ist, dass Sie an mehreren Stellen wiederverwenden können.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }

-1
#import "UIButton+My.h"
#import <QuartzCore/QuartzCore.h>
@implementation UIButton (My)


-(void)fade :(BOOL)enable{
    self.enabled=enable;//
    self.alpha=enable?1.0:0.5;
}

@end

.h:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

2
Eine Beschreibung, die Ihrem Code beiliegt, würde zu einer besseren Antwort führen.
Phantômaxx
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.