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?


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;

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


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.


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.


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

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

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

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


5

W Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

lub

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

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


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

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ół.


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

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


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 !!!


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

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ć.


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

-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
Pewien opis dołączony do Twojego kodu stanowiłby lepszą odpowiedź.
Phantômaxx
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.