無効にされたUIButtonがフェードまたはグレー表示されない


135

私のiPhoneアプリには、Interface Builderで作成したUIButtonがあります。私はコードでこのようにそれを有効にしたり無効にしたりできます...

sendButton.enabled = YES;

または

sendButton.enabled = NO;

ただし、ボタンの外観は常に同じです。色あせや灰色ではありません。クリックしようとすると、期待どおりに有効または無効になります。何か不足していますか?色あせたり、灰色に見えるべきではありませんか?


UIButtonで画像を使用していませんか?
ジャリーヤ

いいえ、ありません。アルファを設定する必要があるため、機能します。
Ravin、2011

回答:


187

次のコードを使用できます。

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

or

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

12
これは動作しますが、私のような制御状態に応じて外観変更ソリューション数えるこれをして、この下からは、はるかに良いアイデアです。状態に応じてコントロールの外観を明示的に更新する必要はなく、組み込みのメカニズムを使用して自動変更を実現しています。
ベンジョン

78

状態設定を無効に変更して、必要なものを選択するだけです。無効状態の背景画像

ここに画像の説明を入力してください


13
これは、Buttonサブ見出しのプロパティのみを変更します。背景色は[表示]サブ見出しの下にあるため、状態設定によって変更されません。
ハンターモンク

2
これはビューの背景色には機能しません。私のプロジェクトでは、以前の回答とこれを組み合わせました。
アントン

40

別のオプションは、無効状態のテキストの色を(たとえば、ライトグレーに)変更することです。

ストーリーボードエディタでDisabledState Configポップアップボタンから選択します。Text Colorポップアップボタンを使用して、テキストの色を変更します。

コードでは、-setTitleColor:forState:メッセージを使用します。


これは、アルファを調整するという例外的な答えよりもはるかに優れたソリューションのようです。私はこれまでに数か月前に投票しており、今は同じ問題でここに戻ってきました。もう一度やりたいです!
ベンジョン2015

うん、実用的な解決策のようです。ライトグレーを使っています。
atereshkov

23

UIControlStateDisabled(無効なグレー画像)とUIControlStateNormal(通常の画像)に異なる画像を設定して、ボタンが無効な状態を生成するようにしてください。


2
彼は画像を使用していませんが、同じ概念をに適用できます[ UIButton setAttributedTitle:forState:]。テキストの前景色を透明色に設定した属性付き文字列を作成します。
nielsbot 2013年

20

ボタンを無効にするとフェードするようにするには、ボタンにアルファを設定できます。次の2つのオプションがあります。

最初の方法:アプリのすべてのボタンに適用する場合は、次のようextensionにUIButton を記述できます。

extension UIButton {

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

}

2番目の方法:アプリのいくつかのボタンに適用するだけの場合は、以下のようにUIButtonからカスタムクラスを記述し、適用するこのクラスを使用できます。

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

13

テキストボタンを使用する場合、viewDidLoadにインスタンスメソッドを配置できます。

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

例:

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

1
これは、テキストボタンの承認された回答である必要があります。現在承認されている回答は、画像ボタンに適しています。私はOPのコメントから取得することは、彼はテキストのボタンを持っているということです。..
アリフス

11

あなたはadjustsImageWhenDisabledどちらのプロパティです使用することができますUIButton
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

例:

 Button.adjustsImageWhenDisabled = false

2
それは何をしますか?なぜ彼がそれを使うべきなのか説明できますか?
ジッピー

7

これはかなり古い質問ですが、これを達成するための非常に簡単な方法があります。

myButton.userInteractionEnabled = false

これにより、ボタンの外観を変更せずにタッチジェスチャーのみが無効になります


5

ではスウィフト

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

または

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0

5

title colorさまざまな状態に設定:

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

使用法:(テキストの色は自動的に変更されます)

loginButton.isEnabled = false

ここに画像の説明を入力してください


3

各ボタンだけではなく、Swift> 3.0で拡張機能を作成する

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

3

あなたは両方の最初の答えを使うことができ、より良い結果になるでしょう。

(ボタンを選択しているときに)属性インスペクターで、State ConfigをDisabledに変更して、無効になっているときに表示される新しい画像を設定します(Content-> Enabledチェックでマーカーを削除して無効にします)。 。

状態を有効に変更すると、画像はこの状態から画像をロードします。

これにアルファロジックを追加することは非常に詳細です。


3

スウィフト4+

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

使い方

myButton.isEnabled = false

2

同じ問題に悩まされています。アルファの設定は私が望んでいるものではありません。

UIButton背景画像」と「背景色」があります。画像の場合UIButton、プロパティは

@property (nonatomic) BOOL adjustsImageWhenDisabled

また、ボタンを無効にすると、背景画像が明るく描画されます。背景色については、Ravinのソリューションであるアルファの設定で問題なく動作します。

まず、Utilities-Attributesの下にある「disabled adjusts image」ボックスがオフになっているかどうかを確認する必要があります。
次に、このボタンの背景色を確認します。

(参考になれば幸いです。これは古い投稿です。Xcodeで変更されている可能性があります)。


1

次のコードは正常に動作するようです。ただし、これが機能しない場合もあります。

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

上記のコードが機能しない場合は、メインスレッドでラップしてください。そう

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

このように迅速に行くなら

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

さらに、UIButtonをカスタマイズした場合は、これをButtonクラスに追加します。

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

ありがとう、コーディングを楽しんでください!!!


1

場合UIButtonの複合状態にあるselecteddisabled、その状態がありますUIControlStateSelected | UIControlStateDisabled

したがって、その状態は次のように調整する必要があります。

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

1つのアプローチはUIButton、次のようにサブクラス化することです。

@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
これは受け入れられる答えになるはずです。SwiftではsetTitleColor(disabledColor、for:[.disabled、.selected])のようなものが必要になります
Paulo Cesar

0

この質問には多くの答えがありますが、本当にbackgroundColorを使用してボタンのスタイルを設定したい場合は、あまり役に立たないように見えます。UIButtonには、さまざまなコントロールの状態に応じてさまざまな画像を設定するオプションがありますが、背景色には同じ機能はありません。したがって、解決策の1つは、カラーから画像を生成してボタンに適用する拡張機能を追加することです。

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

このソリューションの1つの問題のみ-この変更は、ストーリーボードで作成されたボタンには適用されません。私はコードからUIをスタイルすることを好むので、それは問題ではありません。ストーリーボードを使用したい場合は、追加の魔法が@IBInspectable必要です。

2番目のオプションはサブクラス化ですが、これは避けたいと思います。


0

ボタンをサブクラス化して、isEnabled変数をオーバーライドできます。利点は、複数の場所で再利用できることです。

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
あなたのコードに伴ういくつかの説明は、より良い答えになるでしょう。
Phantômaxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.