2011-09-25 47 views
21

我有一個圖像的UIButton和其禁用狀態,這個圖像應該有.3阿爾法。如何在禁用狀態下更改UIButton圖像alpha?

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?)下減少圖像的alpha值。但我想知道如何微調這個價值。

+0

你最終會找到一個解決方案? – bryanmac

+0

我也有興趣找到這個問題的解決方案。 – SAHM

+1

我認爲這個問題的答案是在這裏添加的。 http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –

回答

15

如果在禁用按鈕的情況下設置阿爾法不起作用,那麼只需將您的禁用圖像設置爲所需的阿爾法值即可。

剛剛測試過這個,你可以在UIButton上設置alpha,而不管狀態如何,它工作的很好。

self.yourButton.alpha = 0.25; 
+0

問題是準備好的圖像不知道視圖將會是什麼它背後(這是阿爾法的點) – bryanmac

+0

我同意它是阿爾法的點,PNG支持阿爾法,所以現在怎麼樣與alpha使用股票圖像的問題? 我一直這樣做,實際上我唯一不使用它的時間是當我想在運行時動態改變alpha的淡入淡出效果。 – EricLeaf

+1

alpha PNG上的好點。同樣,對於[button setAlpha],我看到它並且工作正常,唯一的問題是您或其他代碼無法簡單地設置按鈕的狀態 - 您總是必須記住設置alpha並在狀態更改時重置alpha。 – bryanmac

7

您需要兩個UIImage實例,一個用於啓用,一個用於禁用。

艱難的部分是殘疾人,你不能在UIImage上設置阿爾法。您需要將其設置爲UIImageView,但按鈕​​不需要UIImageView,則需要UIImage

如果您確實想要這樣做,您可以在UIImageView中創建一個合成圖像,並在其上設置了alpha後,將相同的圖像加載到禁用的按鈕狀態。

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在底層操作時會修改'imageView'(可能會在默認,選定圖像之間進行切換?),並且如果在按下按鈕時調用'setEnabled',則alpha值可能不會持久(例如,調用' setEnabled'而UIButton同時修改其在選定/高亮/默認狀態之間的外觀)。 –

+0

然後重寫'layoutSubviews'並在需要時調用'[self setNeedsLayout]'。 – Cyrille

+0

' - (void)setEnabled:(BOOL)enabled { super.enabled = 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

@JonHobson感謝您的提示! –

+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) 
相關問題