web-dev-qa-db-ja.com

無効化されたUIButtonはフェードまたはグレーではありません

私のiPhoneアプリには、Interface Builderで作成したUIButtonがあります。私のコードでこのように正常に有効および無効にすることができます...

sendButton.enabled = YES;

または

sendButton.enabled = NO;

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

ありがとう

119
Andy A

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

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

or

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

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

enter image description here

68
Ahmed R.

もう1つのオプションは、無効状態のテキストの色を(たとえば明るい灰色に)変更することです。ストーリーボードエディタで、State ConfigポップアップボタンからDisabledを選択し、Text Colorポップアップボタンを使用してテキストの色を変更します。コードでは、-setTitleColor:forState:メッセージを使用します。

(私はこれが古い投稿であることを認識していますが、他の人がこのオプションを好むかもしれないと思いました)

32
guywithmazda

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

23
Jhaliya

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

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

例:

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

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

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

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

adjustsImageWhenDisabledのプロパティであるUIButtonを使用できます
(@property (nonatomic) BOOL adjustsImageWhenDisabled)

例:

 Button.adjustsImageWhenDisabled = false
10
Mahesh Lad

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

myButton.userInteractionEnabled = false

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

5
Diego A. Rincon

In Swift

previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5

または

nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
4
King-Wizard

各ボタン自体ではなく、Swift> 3.0で拡張機能を作成します

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

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

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

また、状態を有効に変更すると、イメージはこの状態からロードされます。

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

ご挨拶!

3
ChavirA

さまざまな状態に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

enter image description here

2
Kiran S

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

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

@property (nonatomic) BOOL adjustsImageWhenDisabled

また、ボタンを無効にすると、背景画像がより明るく描画されます。背景色については、Ravinのソリューションであるalphaを設定するとうまくいきます。

最初に、[ユーティリティ]-[属性]の下の[画像の調整を無効にする]チェックボックスをオフにしているかどうかを確認する必要があります。
次に、このボタンの背景色を確認します。

(お役に立てば幸いです。これは古い投稿です。Xcodeでは状況が変わったかもしれません)。

2
Yichao Lu

UIButtonselectedおよびdisabledと組み合わされた状態にある場合、その状態はUIControlStateSelected | UIControlStateDisabledです。

そのため、状態を調整する必要があります

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

アプローチは、次のサブクラスUIButtonです。

@implementation TTButton
- (void)awaeFromNib {
   [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
AechoLiu

次のコードは問題なく動作するようです。しかし、場合によっては、これは機能しません。

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

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

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

このようにSwiftで行くと

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
Li Jin

この質問には多くの答えがありますが、ボタンのスタイルを設定するために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
Dzmitry Navak