Wyłączony przycisk UI nie wyblakły ani szary

135

W mojej aplikacji na iPhone'a mam UIButton, który utworzyłem w Interface Builder. Mogę z powodzeniem włączać i wyłączać to w moim kodzie ...

sendButton.enabled = YES;

lub

sendButton.enabled = NO;

Jednak wizualny wygląd przycisku jest zawsze taki sam! Nie jest wyblakły ani szary. Jeśli jednak spróbuję go kliknąć, jest on włączony lub wyłączony zgodnie z oczekiwaniami. Czy coś mi brakuje? Czy nie powinien wyglądać na wyblakły lub szary?

Andy A.
źródło
Czy używasz obrazu ze swoim UIButtonem?
Jhaliya
Nie, nie ma, będziesz musiał ustawić jego alfa, odpowiednio, będzie działać.
Ravin

Odpowiedzi:

187

Możesz użyć następującego kodu:

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

or

sendButton.enabled = NO;
sendButton.alpha = 0.5;
Grabież
źródło
12
Chociaż to działa, uważam, że rozwiązania zmieniające wygląd w zależności od stanu sterowania, takie jak ten i ten od dołu, są znacznie lepszym pomysłem. Używają wbudowanego mechanizmu, aby uzyskać automatyczną zmianę, zamiast jawnie aktualizować wygląd kontrolki w zależności od jej stanu.
Benjohn
78

po prostu zmień konfigurację stanu, aby wyłączyć i wybierz, co chcesz, obraz tła dla stanu wyłączonego

wprowadź opis obrazu tutaj

Ahmed R.
źródło
13
Spowoduje to tylko zmianę właściwości w nagłówku przycisku . Kolor tła jest pod nagłówkiem View , więc nie jest zmieniany przez konfiguracje stanu.
Hunter Monk
2
To nie działa dla koloru tła widoku. W moim projekcie połączyłem poprzednią odpowiedź z tym.
Anton
40

Inną opcją jest zmiana koloru tekstu (na przykład na jasnoszary) dla stanu wyłączenia.

W edytorze serii ujęć, wybrać Disabledz State Configprzycisku kontekstowego. Użyj Text Colorwyskakującego przycisku, aby zmienić kolor tekstu.

W kodzie użyj -setTitleColor:forState:wiadomości.

guywithmazda
źródło
Wydaje się, że jest to znacznie lepsze rozwiązanie niż wyjątkowa odpowiedź polegająca na dostosowaniu alfy. Głosowałem już na to kilka miesięcy temu, a teraz wróciłem tutaj z tym samym problemem, chciałbym móc to powtórzyć!
Benjohn
Tak, wydaje się być działającym rozwiązaniem. Używam tylko jasnoszarego koloru.
atereshkov
23

Spróbuj ustawić różne obrazy dla UIControlStateDisabled(wyłączony szary obraz) i UIControlStateNormal(normalny obraz), aby przycisk generował stan wyłączenia za Ciebie.

Jhaliya
źródło
2
nie używa obrazów - ale możesz zastosować tę samą koncepcję do [ UIButton setAttributedTitle:forState:]. Utwórz swój przypisany ciąg, w którym kolor pierwszego planu tekstu jest ustawiony na przezroczysty kolor.
nielsbot
20

Aby przycisk był wygaszony po wyłączeniu, możesz ustawić dla niego alfa. Masz dwie możliwości:

Pierwszy sposób : jeśli chcesz ubiegać się o wszystkie przyciski w swojej aplikacji, możesz napisać extensiondla UIButton w ten sposób:

extension UIButton {

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

}

Drugi sposób : jeśli chcesz tylko złożyć wniosek o niektóre przyciski w swojej aplikacji, możesz napisać niestandardową klasę z UIButton, jak poniżej, i użyć tej klasy, dla której chcesz się ubiegać:

class MyButton: UIButton {
    override var isEnabled: Bool {
        didSet {
            alpha = isEnabled ? 1.0 : 0.5
        }
    }
}
Heo Đất Hades
źródło
13

Jeśli używasz przycisku tekstowego, możesz umieścić metodę instancji w viewDidLoad

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

przykład:

[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
Antonio Moro
źródło
1
Powinna to być zaakceptowana odpowiedź dla przycisku tekstowego. Obecna zaakceptowana odpowiedź jest odpowiednia dla przycisku graficznego. Z komentarzy opa wynika, że ​​ma on przycisk tekstowy ...
Ali Hus
11

Możesz użyć tego, adjustsImageWhenDisabledco jest własnościąUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Dawny:

 Button.adjustsImageWhenDisabled = false
Mahesh Lad
źródło
2
Co to robi? Czy możesz wyjaśnić, dlaczego miałby tego używać?
Zippy
7

To dość stare pytanie, ale można to osiągnąć w bardzo prosty sposób.

myButton.userInteractionEnabled = false

Spowoduje to wyłączenie tylko wszelkich gestów dotykowych bez zmiany wyglądu przycisku

Diego A. Rincon
źródło
5

W Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

lub

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
King-Wizard
źródło
5

Zestaw title colordla różnych stanów:

@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)
        }
    }

Sposób użycia: (kolor tekstu zmieni się automatycznie)

loginButton.isEnabled = false

wprowadź opis obrazu tutaj

Kiran S
źródło
3

Utwórz rozszerzenie w Swift> 3.0, a nie każdy przycisk samodzielnie

extension UIButton {
    override open var isEnabled : Bool {
        willSet{
            if newValue == false {
                self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
            }
        }
    }
}
iosMentalist
źródło
3

Możesz użyć obu pierwszych odpowiedzi i będzie to lepszy wynik.

W inspektorze atrybutów (po wybraniu przycisku) zmień konfigurację stanu na Wyłączone, aby ustawić nowy obraz, który będzie się pojawiał, gdy będzie wyłączony (usuń znacznik w polu Zawartość-> Włączone, aby go wyłączyć) .

A kiedy zmienisz stan na włączony, obraz załaduje ten z tego stanu.

Dodanie do tego logiki alfa to dobry szczegół.

ChavirA
źródło
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
                }
            }
        }
    }
}

Jak używać

myButton.isEnabled = false
Rashid Latif
źródło
2

Utknąłem na tym samym problemie. Ustawienie alfa nie jest tym, czego chcę.

UIButtonzawiera „ obraz tła ” i „ kolor tła ”. W przypadku obrazu UIButtonma właściwość as

@property (nonatomic) BOOL adjustsImageWhenDisabled

Obraz tła jest jaśniejszy, gdy przycisk jest wyłączony. W przypadku koloru tła ustawienie alfa, roztwór Ravina, działa dobrze.

Najpierw musisz sprawdzić, czy odznaczyłeś pole „wyłączone dostosowuje obraz” w Utilities-Attributes.
Następnie sprawdź kolor tła tego przycisku.

(Mam nadzieję, że to pomocne. To jest stary post; coś mogło się zmienić w Xcode).

Yichao Lu
źródło
1

Wygląda na to, że poniższy kod działa dobrze. Ale w niektórych przypadkach to nie działa.

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

Jeśli powyższy kod nie działa, zawiń go w główny wątek. więc

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

jeśli pójdziesz szybko, w ten sposób

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

Ponadto, jeśli dostosowałeś UIButton, dodaj to do klasy Button.

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

Dziękuję i życzę miłego kodowania !!!

Li Jin
źródło
1

Jeśli UIButtonjest w połączonym stanie selectedi disabled, jego stan to UIControlStateSelected | UIControlStateDisabled.

Więc jego stan należy dostosować w następujący sposób:

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

Jedną z metod jest podklasa UIButtonw następujący sposób:

@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
AechoLiu
źródło
1
To powinna być akceptowana odpowiedź. W Swift będziesz potrzebować czegoś takiego jak setTitleColor (disabledColor, dla: [.disabled, .selected])
Paulo Cesar
0

To pytanie ma wiele odpowiedzi, ale wszystkie one wyglądają niezbyt przydatne w przypadku, gdy naprawdę chcesz użyć backgroundColor do stylizacji przycisków. UIButton ma fajną opcję ustawiania różnych obrazów dla różnych stanów kontrolnych, ale nie ma tej samej funkcji dla kolorów tła. Tak więc jednym z rozwiązań jest dodanie rozszerzenia, które będzie generowało obrazy z koloru i nanosi je na przycisk.

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

Tylko jeden problem z tym rozwiązaniem - ta zmiana nie zostanie zastosowana do przycisków utworzonych w scenorysie. Jeśli chodzi o mnie, nie stanowi to problemu, ponieważ wolę stylizować interfejs użytkownika z kodu. Jeśli chcesz używać scenorysów, @IBInspectablepotrzebna jest dodatkowa magia .

Druga opcja to tworzenie podklas, ale wolę tego unikać.

oroom
źródło
0

Może możesz utworzyć podklasę swojego przycisku i nadpisać zmienną isEnabled. Zaletą jest to, że możesz ponownie użyć w wielu miejscach.

override var isEnabled: Bool {
     didSet {
         if isEnabled {
             self.alpha = 1
         } else {
             self.alpha = 0.2
         }
     }
 }
Jay Mayu
źródło
-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

źródło
2
Pewien opis dołączony do Twojego kodu stanowiłby lepszą odpowiedź.
Phantômaxx