2011-09-25 18 views
21

मेरे पास एक छवि और इसके अक्षम राज्य पर UIButton है, इस छवि में .3 अल्फा होना चाहिए।आप अक्षम राज्य पर UIButton छवि अल्फा कैसे बदलते हैं?

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
UIImage *arrowImage = [UIImage imageNamed:@"arrow.png"]; 
[button setImage:arrowImage forState:UIControlStateNormal]; 

// The arrow should be half transparent here 
[button setImage:arrowImage forState:UIControlStateDisabled]; 

मैं इसे कैसे पूरा करूं?

अद्यतन: मैंने देखा कि डिफ़ॉल्ट रूप से UIButton अक्षम स्थिति (शायद .5 पर) पर छवि के अल्फा को कम करता है। लेकिन मैं जानना चाहता हूं कि इस मूल्य को कैसे ठीक किया जाए।

+0

आप अंत किया था इस के लिए एक समाधान खोजने के? – bryanmac

+0

मुझे इस प्रश्न के समाधान खोजने में भी दिलचस्पी होगी। – SAHM

+1

मुझे लगता है कि इस प्रश्न का उत्तर यहां जोड़ा गया था। http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –

उत्तर

15

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

बस इसका परीक्षण किया गया है, आप यूआई बटन पर अल्फा सेट कर सकते हैं, चाहे राज्य के बावजूद और यह ठीक काम करता है।

self.yourButton.alpha = 0.25; 
+0

समस्या यह है कि तैयार छवि यह नहीं जानती कि क्या दृश्य होने जा रहा है इसके पीछे (जो अल्फा का बिंदु है) – bryanmac

+0

मैं मानता हूं कि यह अल्फा का बिंदु है, पीएनजी अल्फा का समर्थन करता है, तो अब अल्फा के साथ स्टॉक छवि का उपयोग करने में समस्या क्या है? मैं यह हर समय करता हूं, वास्तव में केवल एक बार जब मैं इसका उपयोग नहीं करता हूं तब मैं रनटाइम पर फीका प्रभाव के लिए अल्फा को गतिशील रूप से बदलना चाहता हूं। – EricLeaf

+1

अल्फा पीएनजी पर अच्छा बिंदु।इसके अलावा [बटन सेटएल्फा] के लिए, मैंने देखा और यह काम करता है, केवल समस्या यह है कि आप या अन्य कोड बस बटन की स्थिति सेट नहीं कर सकते हैं - आपको हमेशा अल्फा सेट करना और राज्य परिवर्तनों पर अल्फा को रीसेट करना याद रखना होगा। – bryanmac

7

आप UIImage के दो उदाहरणों, सक्षम के लिए एक और विकलांगों के लिए एक की जरूरत है।

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

यदि आप वास्तव में ऐसा करना चाहते हैं, तो आप UIImageView से परिणामस्वरूप छवि बनाने के बाद अक्षम छवि स्थिति में उसी छवि को लोड कर सकते हैं जिसमें अल्फा सेट है।

UIImageView *uiv = [UIImageView alloc] initWithImage:[UIImage imageNamed:@"arrow.png"]; 

// get resultant UIImage from UIImageView 
UIGraphicsBeginImageContext(uiv.image.size); 
CGRect rect = CGRectMake(0, 0, uiv.image.size.width, uiv.image.size.height); 
[uiv.image drawInRect:rect blendMode:kCGBlendModeScreen alpha:0.2]; 

UIImage *disabledArrow = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

[button setImage:disabledArrow forState:UIControlStateDisabled]; 

अल्फा नियंत्रित बटन छवि प्राप्त करने के लिए यह बहुत कुछ है। एक आसान तरीका हो सकता है लेकिन यह सब मुझे मिल सकता है। उम्मीद है की वो मदद करदे।

+1

धन्यवाद @bryanmac !! :) – Salmo

4

उपवर्गीकरण UIButton और setEnabled: विधि को विस्तार से काम करने लगता है:

- (void) setEnabled:(BOOL)enabled {  
    [super setEnabled:enabled]; 
    if (enabled) { 
     self.imageView.alpha = 1; 
    } else { 
     self.imageView.alpha = .25; 
    } 
} 

मैं इसे अच्छी तरह से परीक्षण नहीं किया है, लेकिन अगर स्क्रीन को घुमाने मूल्य फिर सेट करता है मिला। setFrame: विधि में एक ही कोड जोड़ने से यह ठीक हो जाता है, लेकिन मुझे यकीन नहीं है कि क्या अन्य स्थितियां हैं जहां यह मान बदल दिया गया है।

+1

मुझे पता चला है कि कभी-कभी यह काम नहीं करता है। मुझे लगता है कि UIButton हुड के तहत अपनी खुद की सामग्री (शायद डिफ़ॉल्ट, चयनित छवियों के बीच बदल रहा है) के दौरान 'छवि दृश्य' को संशोधित करता है, और अल्फा मान तब तक जारी नहीं रह सकता है जब 'सेट सक्षम' बटन को टैप किया जाता है (उदाहरण के लिए, कॉलिंग ' setEnabled' जबकि यूआईबटन एक साथ चयनित/हाइलाइट/डिफ़ॉल्ट राज्यों के बीच अपनी उपस्थिति को संशोधित कर रहा है)। –

+0

फिर आवश्यक होने पर 'layoutSubviews' को ओवरराइड करें और '[self setNeedsLayout]' को कॉल करें। – Cyrille

+0

'- (शून्य) सेट सक्षम: (बूल) सक्षम { super.enabled = सक्षम; self.imageView.alpha = सक्षम? 1: 0.5; self.titleLabel.alpha = self.imageView.alpha; } ' –

13

क्रेडिट @bryanmac पर उनके helpful answer के लिए जाता है। मैंने अपने कोड को शुरुआती बिंदु के रूप में उपयोग किया, लेकिन पाया कि UIImageView का उपयोग किए बिना वही चीज़ हासिल की जा सकती है।

- (UIImage *)translucentImageFromImage:(UIImage *)image withAlpha:(CGFloat)alpha 
{ 
    CGRect rect = CGRectZero; 
    rect.size = image.size; 

    UIGraphicsBeginImageContext(image.size); 
    [image drawInRect:rect blendMode:kCGBlendModeScreen alpha:alpha]; 
    UIImage * translucentImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return translucentImage; 
} 

विकलांग राज्य के लिए बटन की पृष्ठभूमि छवि सेट करें::

यहाँ मेरी समाधान है

UIImage * disabledBgImage = [self translucentImageFromImage:originalBgImage withAlpha:0.5f]; 
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled]; 

संपादित करें:

मैं एक बनाने के द्वारा आगे मेरी समाधान परिष्कृत इस के साथ UIImage पर श्रेणी विधि:

- (UIImage *)translucentImageWithAlpha:(CGFloat)alpha 
{ 
    UIGraphicsBeginImageContextWithOptions(self.size, NO, 0.0); 
    CGRect bounds = CGRectMake(0, 0, self.size.width, self.size.height); 
    [self drawInRect:bounds blendMode:kCGBlendModeScreen alpha:alpha]; 

    UIImage * translucentImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return translucentImage; 
} 

विकलांग राज्य के लिए बटन की पृष्ठभूमि छवि सेट करें:

UIImage * disabledBgImage = [originalBgImage translucentImageWithAlpha:0.5f]; 
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled]; 
+4

यह बहुत अच्छा काम किया। हालांकि यह मेरी छवि के @ 2x संस्करण का उपयोग नहीं किया। यदि आप UIGraphicsBeginImageContextWithOptions (image.size, NO, 0.0) का उपयोग करते हैं; UIGraphicsBeginImageContext (image.size) के बजाय यह रेटिना छवियों का भी समर्थन करेगा। –

+0

@ जोनबॉसन टिप के लिए धन्यवाद! –

+0

यह एक अच्छा जवाब है! अब मैं अपने ऐप में इसका उपयोग कर रहा हूं। धन्यवाद @StephSharp! –

1

मैंने पाया कि इन समाधानों में से कोई भी वास्तव में काम करते हैं। यह ऐसा करने का स्पष्ट तरीका उपवर्ग के लिए है, और self.imageView उपयोग करने के बजाय, सिर्फ इस तरह अपने स्वयं के कस्टम imageView जोड़ें:

_customImageView = [[UIImageview alloc] initWithImage:image]; 

फिर तो जैसे अपने कस्टम अल्फा जोड़ें:

- (void)setEnabled:(BOOL)enabled { 
    [super setEnabled:enabled]; 
    if (enabled) { 
     _customImageView.alpha = 1.0f; 
    } else { 
     _customImageView.alpha = 0.25f; 
    } 
} 
+0

आपके उत्तर की अवधारणा सही है। – enadun

2

बटन की छवि दृश्य। (केवल पढ़ने के लिए)

@property(nonatomic, readonly, retain) UIImageView *imageView 

हालांकि यह संपत्ति केवल पढ़ने के लिए है, इसकी अपनी संपत्तियां पढ़ी/लिखती हैं।

0
- (UIImage *)imageWithColor:(UIColor *)color { 
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f); 
UIGraphicsBeginImageContext(rect.size); 
CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSetFillColorWithColor(context, [color CGColor]); 
CGContextFillRect(context, rect); 

UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

return image; } 

उपयोग: [btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false;

+0

यह किसी भी कोड पर डंप करने के लिए कोई सहायक प्रयास नहीं है। कृपया इसे सुधारें। – Drew

3

मामले में किसी को भी यह की जरूरत है, यहाँ स्विफ्ट में एक जवाब है:

उपवर्ग UIButton और ओवरराइड सक्षम

class MyCustomButton: UIButton { 

override var enabled: Bool { 
    didSet{ 
     alpha = enabled ? 1.0 : 0.3 
    } 
} 

आप चाहते हैं किसी भी बटन के वर्ग सेट करें इस संपत्ति को "MyCustomButton" (या जिसे आप इसे नाम देने के लिए चुनते हैं) "

@IBOutlet weak var nextButton: MyCustomButton! 
0

स्विफ्ट 3:

extension UIImage { 
    func copy(alpha: CGFloat) -> UIImage? { 
     UIGraphicsBeginImageContextWithOptions(size, false, scale) 
     draw(at: CGPoint.zero, blendMode: .normal, alpha: alpha) 
     let newImage = UIGraphicsGetImageFromCurrentImageContext() 
     UIGraphicsEndImageContext() 
     return newImage 
    } 
} 

उपयोग:

button.setImage(image.copy(alpha: 0.3), for: .disabled) 
संबंधित मुद्दे