अक्षम UIButton फीका या ग्रे नहीं है


135

मेरे iPhone ऐप में, मेरे पास एक UIButton है जो मैंने इंटरफ़ेस बिल्डर में बनाया है। मैं अपने कोड में इसे इस तरह सक्षम और अक्षम कर सकता हूं ...

sendButton.enabled = YES;

या

sendButton.enabled = NO;

हालाँकि, बटन का विज़ुअल लुक हमेशा एक जैसा होता है! यह फीका या स्लेटी नहीं होता है। यदि मैं इसे क्लिक करने का प्रयास करता हूं, तो यह अपेक्षित के रूप में सक्षम या अक्षम है। क्या मैं कुछ भूल रहा हूँ? यह फीका या ग्रे नहीं दिखना चाहिए?


आप अपने UIButton के साथ छवि का उपयोग कर रहे हैं?
झलिया

नहीं, यह नहीं है, आपको इसके अल्फा को सेट करने की आवश्यकता होगी, तदनुसार, यह काम करेगा।
रविन

जवाबों:


187

आप निम्नलिखित कोड का उपयोग कर सकते हैं:

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

or

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

12
जबकि यह काम करता है मैं समाधान है कि इस तरह के नियंत्रण की स्थिति के आधार पर देखो बदलने के लिए और नीचे से यह एक बेहतर विचार है। वे अपने राज्य के आधार पर नियंत्रण के रूप को स्पष्ट रूप से अपडेट करने की आवश्यकता के बजाय, स्वचालित परिवर्तन प्राप्त करने के लिए अंतर्निहित तंत्र का उपयोग कर रहे हैं।
बेंजो जूल

78

बस निष्क्रिय करने के लिए राज्य की स्थिति को बदलें और जो आप चाहते हैं उसे चुनें, विकलांग राज्य के लिए छवि

यहाँ छवि विवरण दर्ज करें


13
यह केवल बटन उप शीर्षक में गुण बदलता है । बैकग्राउंड का रंग व्यू सबहेडिंग के तहत है , इसलिए स्टेट कॉन्फिग्स द्वारा नहीं बदला जाता है।
हंटर भिक्षु

2
यह दृश्य की पृष्ठभूमि के रंग के लिए काम नहीं कर रहा है। अपनी परियोजना में मैंने पिछले उत्तर और यह संयुक्त किया।
एंटोन

40

एक अन्य विकल्प विकलांग राज्य के लिए पाठ का रंग (उदाहरण के लिए हल्के भूरे रंग) को बदलना है।

स्टोरीबोर्ड संपादक में, पॉपअप बटन Disabledसे चुनें State ConfigText Colorटेक्स्ट का रंग बदलने के लिए पॉपअप बटन का उपयोग करें ।

कोड में, -setTitleColor:forState:संदेश का उपयोग करें ।


यह अल्फा को समायोजित करने के अपवादित उत्तर की तुलना में बहुत बेहतर समाधान की तरह लगता है। मैंने पहले ही इसे महीनों पहले वोट कर दिया था और अब मैं उसी समस्या के साथ यहां वापस आ गया हूं, काश मैं इसे फिर से कर पाता!
बेंजोएन

हां, लगता है कि एक काम कर समाधान है। मैं सिर्फ हल्के भूरे रंग का उपयोग करता हूं।
अपरेशकोव

23

UIControlStateDisabled(अक्षम ग्रे छवि) और UIControlStateNormal(सामान्य छवि) के लिए अलग-अलग छवियों को सेट करने का प्रयास करें ताकि बटन आपके लिए अक्षम स्थिति उत्पन्न कर सके।


2
वह छवियों का उपयोग नहीं कर रहा है - लेकिन आप इसी अवधारणा को लागू कर सकते हैं [ UIButton setAttributedTitle:forState:]। अपना एट्रिब्यूट स्ट्रिंग बनाएं जहां आपका टेक्स्ट अग्रभूमि रंग पारदर्शी रंग पर सेट हो।
नील्सबोट

20

अक्षम होने पर बटन को फीका करने के लिए, आप इसके लिए अल्फा सेट कर सकते हैं। आपके लिए दो विकल्प हैं:

पहला तरीका : यदि आप अपने ऐप में अपने सभी बटनों के लिए आवेदन करना चाहते हैं, तो आप extensionइस तरह से UIButton के लिए लिख सकते हैं :

extension UIButton {

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

}

दूसरा तरीका : यदि आप अपने ऐप के कुछ बटन के लिए आवेदन करना चाहते हैं, तो आप नीचे की तरह 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
यह एक टेक्स्ट बटन के लिए स्वीकृत उत्तर होना चाहिए .. एक छवि बटन के लिए वर्तमान स्वीकृत उत्तर अच्छा है। मुझे ऑप्स की टिप्पणियों से जो मिलता है वह यह है कि उसके पास एक टेक्स्ट बटन है ..
अली हुसैन

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

प्रत्येक बटन के बजाय स्विफ्ट> 3.0 में एक एक्सटेंशन बनाएं

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

3

आप दोनों पहले उत्तरों का उपयोग कर सकते हैं और बेहतर परिणाम देने वाले हैं।

विशेषता निरीक्षक में (जब आप बटन का चयन कर रहे होते हैं), निष्क्रिय होने पर दिखाई देने वाली नई छवि को सेट करने के लिए अक्षम करें स्थिति कॉन्फ़िगर करें (सामग्री में मार्कर को हटाएं-> इसे अक्षम करने के लिए सक्षम चेक) ।

और जब आप राज्य को सक्षम में बदलते हैं, तो छवि इस स्थिति से लोड हो जाएगी।

इसमें अल्फा लॉजिक को जोड़ना एक अच्छा विवरण है।


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

और बटन के निष्क्रिय होने पर बैकग्राउंड इमेज हल्का हो जाता है। पृष्ठभूमि के रंग के लिए, अल्फा की स्थापना, रविन का समाधान, ठीक काम करता है।

सबसे पहले, आपको यह जांचना होगा कि क्या आपने यूटिलिटीज-एट्रीब्यूट्स के तहत "अक्षम समायोजन छवि" बॉक्स को अनचेक किया है या नहीं।
फिर, इस बटन के लिए पृष्ठभूमि का रंग जांचें।

(आशा है कि यह उपयोगी है। यह एक पुरानी पोस्ट है; 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 को अनुकूलित किया है, तो इसे बटन वर्ग में जोड़ें।

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

धन्यवाद और कोडिंग का आनंद लें !!!


1

यदि UIButtonसंयुक्त अवस्था में है selectedऔर disabled, इसका राज्य है UIControlStateSelected | UIControlStateDisabled

तो इसके राज्य को इस तरह समायोजित करने की आवश्यकता है:

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

एक उपवर्ग 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
यह स्वीकृत उत्तर होना चाहिए। स्विफ्ट पर आपको कुछ सेट की आवश्यकता होगी जैसे कि setTleleColor (disableColor, for: [.Disabled, .selected]]
पाउलो सेसर

0

इस सवाल के बहुत सारे उत्तर हैं, लेकिन यदि आप वास्तव में अपने बटनों को स्टाइल करने के लिए बैकग्राउंडर का उपयोग करना चाहते हैं तो वे सभी बहुत उपयोगी नहीं लगते हैं। UIButton के पास अलग-अलग नियंत्रण राज्यों के लिए अलग-अलग छवियां सेट करने का अच्छा विकल्प है, लेकिन पृष्ठभूमि के रंगों के लिए समान सुविधा नहीं है। तो समाधानों में से एक विस्तार जोड़ना है जो रंग से छवियां उत्पन्न करेगा और उन्हें बटन पर लागू करेगा।

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

इस समाधान के साथ केवल एक समस्या - यह परिवर्तन स्टोरीबोर्ड में बनाए गए बटनों पर लागू नहीं होगा। मेरे लिए यह एक मुद्दा नहीं है क्योंकि मैं यूआई को कोड से स्टाइल करना पसंद करता हूं। यदि आप स्टोरीबोर्ड का उपयोग करना चाहते हैं तो कुछ अतिरिक्त जादू के साथ@IBInspectable जरूरत के ।

दूसरा विकल्प उपवर्ग है लेकिन मैं इससे बचना पसंद करता हूं।


0

हो सकता है कि आप अपने बटन को दबा सकते हैं और अपने निष्क्रिय चर को ओवरराइड कर सकते हैं। लाभ यह है कि आप कई स्थानों पर पुन: उपयोग कर सकते हैं।

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

ज:

#import <UIKit/UIKit.h>
@interface UIButton (My)

-(void)fade :(BOOL)enable;

@end

2
आपके कोड के साथ कुछ विवरण बेहतर उत्तर के लिए बनाते हैं।
फैंटमैक्सएक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.