私のiPhoneアプリには、Interface Builderで作成したUIButtonがあります。私のコードでこのように正常に有効および無効にすることができます...
sendButton.enabled = YES;
または
sendButton.enabled = NO;
ただし、ボタンの視覚的な外観は常に同じです!色あせも灰色もありません。ただし、クリックしようとすると、期待どおりに有効または無効になります。何か不足していますか?色あせたり灰色に見えるべきではありませんか?
ありがとう
次のコードを使用できます。
sendButton.enabled = YES;
sendButton.alpha = 1.0;
or
sendButton.enabled = NO;
sendButton.alpha = 0.5;
もう1つのオプションは、無効状態のテキストの色を(たとえば明るい灰色に)変更することです。ストーリーボードエディタで、State ConfigポップアップボタンからDisabledを選択し、Text Colorポップアップボタンを使用してテキストの色を変更します。コードでは、-setTitleColor:forState:メッセージを使用します。
(私はこれが古い投稿であることを認識していますが、他の人がこのオプションを好むかもしれないと思いました)
UIControlStateDisabled
(無効なグレー画像)とUIControlStateNormal
(通常画像)に異なる画像を設定して、ボタンが無効な状態を生成するようにしてください。
テキストボタンを使用する場合、viewDidLoadにインスタンスメソッドを配置できます。
- (void)setTitleColor:(UIColor *)color forState:(UIControlState)state
例:
[self.syncImagesButton setTitleColor:[UIColor grayColor] forState:UIControlStateDisabled];
無効にするとボタンがフェードするようにするには、アルファを設定できます。次の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
}
}
}
adjustsImageWhenDisabled
のプロパティであるUIButton
を使用できます(@property (nonatomic) BOOL adjustsImageWhenDisabled)
例:
Button.adjustsImageWhenDisabled = false
これは非常に古い質問ですが、これを達成するための非常に簡単な方法があります。
myButton.userInteractionEnabled = false
これにより、ボタンの外観を変更せずに、タッチジェスチャのみが無効になります。
In Swift:
previousCustomButton.enabled = false
previousCustomButton.alpha = 0.5
または
nextCustomButton.enabled = true
nextCustomButton.alpha = 1.0
各ボタン自体ではなく、Swift> 3.0で拡張機能を作成します
extension UIButton {
override open var isEnabled : Bool {
willSet{
if newValue == false {
self.setTitleColor(UIColor.gray, for: UIControlState.disabled)
}
}
}
両方の最初の答えを使用することができ、より良い結果になるでしょう。
属性インスペクター(ボタンを選択しているとき)で、State ConfigをDisabledに変更して、無効になったときに表示される新しい画像を設定します(Content-> Enabledチェックでマーカーを削除して無効にします) 。
また、状態を有効に変更すると、イメージはこの状態からロードされます。
これにアルファロジックを追加することは非常に詳細です。
ご挨拶!
私は同じ問題に悩まされています。アルファを設定することは、私が望むものではありません。
UIButton
には「背景画像」と「背景色」があります。画像の場合、UIButton
には次のプロパティがあります
@property (nonatomic) BOOL adjustsImageWhenDisabled
また、ボタンを無効にすると、背景画像がより明るく描画されます。背景色については、Ravinのソリューションであるalphaを設定するとうまくいきます。
最初に、[ユーティリティ]-[属性]の下の[画像の調整を無効にする]チェックボックスをオフにしているかどうかを確認する必要があります。
次に、このボタンの背景色を確認します。
(お役に立てば幸いです。これは古い投稿です。Xcodeでは状況が変わったかもしれません)。
UIButton
がselected
および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
次のコードは問題なく動作するようです。しかし、場合によっては、これは機能しません。
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
}
}
}
}
ありがとう、コーディングをお楽しみください!!!
この質問には多くの答えがありますが、ボタンのスタイルを設定するために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番目のオプションはサブクラス化ですが、これを避けることを好みます。