Devre dışı UIB düğmesi soluk veya gri değil


135

İPhone uygulamamda, Interface Builder'da oluşturduğum bir UIButtonum var. Kodumda başarıyla bu şekilde etkinleştirebilir ve devre dışı bırakabilirim ...

sendButton.enabled = YES;

veya

sendButton.enabled = NO;

Ancak, düğmenin görsel görünümü her zaman aynıdır! Soluk veya gri değil. Yine de tıklamaya çalışırsam, beklendiği gibi etkinleştirilir veya devre dışı bırakılır. Bir şey mi kaçırıyorum? Soluk veya gri görünmemeli mi?


UIButton'unuzla resim mi kullanıyorsunuz?
Jhaliya

Hayır, almıyor, alfa ayarlamanız gerekecek, buna göre çalışacak.
Ravin

Yanıtlar:


187

Aşağıdaki kodu kullanabilirsiniz:

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

or

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

12
Bu işe yararken ben gibi kontrol durumuna bağlı olarak görünümünü değiştirmek çözümler herhalde bu ve bu alttan çok daha iyi bir fikir. Durumuna bağlı olarak kontrolün görünümünü açıkça güncellemek yerine otomatik bir değişiklik elde etmek için yerleşik mekanizmayı kullanıyorlar.
Benjohn

78

sadece devre dışı bırakmak ve ne istediğinizi seçmek için durum yapılandırmasını değiştirin, arka plan Engelli durumu için görüntü

resim açıklamasını buraya girin


13
Bu yalnızca Button alt başlığındaki özellikleri değiştirir . Arka plan rengi Görünüm alt başlığının altında olduğundan durum yapılandırmaları tarafından değiştirilmez.
Hunter Monk

2
Bu görünümün arka plan rengi için çalışmıyor. Projemde önceki cevabı ve bunu birleştirdim.
Anton

40

Başka bir seçenek, devre dışı durum için metin rengini (örneğin açık gri olarak) değiştirmektir.

Film şeridi düzenleyicisinde, seçim Disableddan State Configaçılan düğmesi. Text ColorMetin rengini değiştirmek için açılır düğmeyi kullanın .

Kodda, -setTitleColor:forState:mesajı kullanın .


Bu, alfa ayarlamasının istisna cevabından çok daha iyi bir çözüm gibi görünüyor. Bunu aylar önce oylamıştım ve şimdi de aynı problemle buraya geldim, keşke tekrar yapabilseydim!
Benjohn

Evet, çalışan bir çözüm gibi görünüyor. Sadece açık gri rengi kullanıyorum.
atereshkov

23

İçin farklı görüntüler ayarlamaya çalışın UIControlStateDisabled(Devre dışı gri görüntü) ve UIControlStateNormal(Normal görüntü) böylece düğme sizin için devre dışı durumu oluşturur.


2
resimler kullanmıyor - ama aynı kavramı uygulayabilirsiniz [ UIButton setAttributedTitle:forState:]. İlişkilendirilmiş dizenizi metninizin ön plan renginin saydam bir renge ayarlandığı yerde oluşturun.
nielsbot

20

Devre dışı bırakıldığında düğmenin solmasını sağlamak için bunun için alfa ayarlayabilirsiniz. Sizin için iki seçenek vardır:

İlk yol : Uygulamanızdaki tüm düğmelerinize başvurmak istiyorsanız, extensionUIButton için şöyle yazabilirsiniz :

extension UIButton {

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

}

İkinci yol : Uygulamanızdaki bazı düğmelere başvurmak istiyorsanız, aşağıdaki gibi UIButton'dan özel bir sınıf yazabilir ve uygulamak istediğiniz bu sınıfı kullanabilirsiniz:

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

13

Bir metin düğmesi kullanırsanız, viewDidLoad örnek yöntemini

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

misal:

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

1
Bu bir metin düğmesi için kabul edilen cevap olmalıdır. Geçerli kabul edilen cevap bir görüntü düğmesi için iyidir. Op'un yorumlarından aldığım şey, bir metin düğmesine sahip olması ..
Ali Hus

11

adjustsImageWhenDisabledHangi özelliği kullanabilirsinizUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

Ör:

 Button.adjustsImageWhenDisabled = false

2
Bu ne yapar? Bunu neden kullanması gerektiğini açıklayabilir misiniz?
Zippy

7

Bu oldukça eski bir soru ama bunu başarmanın çok basit bir yolu var.

myButton.userInteractionEnabled = false

Bu, herhangi bir dokunma hareketini yalnızca düğmenin görünümünü değiştirmeden devre dışı bırakır


5

In Swift :

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

veya

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

5

title colorFarklı durumlar için ayarla :

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

Kullanımı: (metin rengi otomatik olarak değişecektir)

loginButton.isEnabled = false

resim açıklamasını buraya girin


3

Swift> 3.0'da her düğmenin kendisi yerine bir uzantı oluşturun

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

3

Her iki ilk yanıtı da kullanabilirsiniz ve daha iyi bir sonuç olacaktır.

Özellik denetçisinde (düğmeyi seçtiğinizde), devre dışı bırakıldığında görünecek yeni Görüntüyü ayarlamak için Durum Yapılandırmasını Devre Dışı olarak değiştirin (devre dışı bırakmak için İçerik-> Etkin denetimindeki işaretçiyi kaldırın) .

Durumu etkin olarak değiştirdiğinizde, görüntü bu durumdan yüklenir.

Buna alfa mantığı eklemek iyi bir ayrıntı.


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

Nasıl kullanılır

myButton.isEnabled = false

2

Aynı sorun üzerinde sıkışıp kaldım. Alfa ayarlamak istediğim gibi değil.

UIButton" arka plan resmi " ve " arka plan rengi " vardır. Görüntü için, UIButtonbir özellik olarak bulunur

@property (nonatomic) BOOL adjustsImageWhenDisabled

Düğme devre dışı bırakıldığında arka plan görüntüsü daha açık olarak çizilir. Arka plan rengi için, Alfa'nın çözümü, Alfa'nın ayarı iyi çalışır.

İlk olarak, Utilities-Attributes altındaki "devre dışı bırakılmış görüntü ayarlar" kutusunun işaretini kaldırıp açmadığınızı kontrol etmeniz gerekir.
Ardından, bu düğmenin arka plan rengini kontrol edin.

(Umarım faydalıdır. Bu eski bir gönderi; Xcode'da işler değişmiş olabilir).


1

Aşağıdaki kod iyi çalışıyor gibi görünüyor. Ancak bazı durumlarda bu işe yaramaz.

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

Yukarıdaki kod işe yaramazsa, lütfen Ana Konuya sarın. yani

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

eğer hızlıca gidersen böyle

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

Ayrıca, UIButton'u özelleştirdiyseniz, bunu Button sınıfına ekleyin.

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

Teşekkür ederim ve kodlamanın tadını çıkarın !!!


1

Eğer UIButtonbirleşik durumdadır selectedve disabledonun devlettirUIControlStateSelected | UIControlStateDisabled .

Yani durumu şu şekilde ayarlanmalıdır:

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

Bir yaklaşım UIButtonaşağıdaki gibi alt sınıflara ayırmaktır :

@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
Bu kabul edilen cevap olmalı. Swift'te setTitleColor (engelliColor, için: [.disabled, .selected]) gibi bir şeye ihtiyacınız olacak
Paulo Cesar

0

Bu sorunun birçok yanıtı var, ancak düğmelerinizi stilize etmek için backgroundColor'u gerçekten kullanmak istiyorsanız, hepsi çok kullanışlı görünmüyor. UIButton, farklı kontrol durumları için farklı görüntüler ayarlamak için güzel bir seçeneğe sahiptir, ancak arka plan renkleri için aynı özellik yoktur. Bu nedenle çözümlerden biri, renkli görüntüler oluşturacak ve düğmeye uygulanacak bir uzantı eklemektir.

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

Bu çözümle ilgili yalnızca bir sorun - bu değişiklik film şeridinde oluşturulan düğmelere uygulanmayacak. Bana gelince bu bir sorun değil çünkü kod UI stil tercih ederim. Görsel senaryo taslaklarını kullanmak istiyorsanız,@IBInspectable ihtiyaç duyduğunuz .

İkinci seçenek alt sınıflandırmadır, ancak bundan kaçınmayı tercih ederim.


0

Belki düğmenizi alt sınıflandırabilir ve isEnabled değişkeninizi geçersiz kılabilirsiniz. Avantajı, birden fazla yerde yeniden kullanabilmenizdir.

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
Kodunuzla birlikte verilen bazı açıklamalar daha iyi bir yanıt sağlayacaktır.
Phantômaxx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.