簡體   English   中英

如何在禁用狀態下更改 UIButton 圖像 alpha?

[英]How do you change UIButton image alpha on disabled state?

我有一個帶有圖像的 UIButton,在它的禁用狀態下,這個圖像應該有 0.3 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 確實會降低禁用狀態下圖像的 alpha(可能為 0.5?)。 但我想知道如何微調這個值。

如果在按鈕禁用時設置 alpha 不起作用,那么只需將禁用的圖像設置為您想要的 alpha 值。

剛剛對此進行了測試,您可以在 UIButton 上設置 alpha,無論狀態如何,它都可以正常工作。

self.yourButton.alpha = 0.25;

感謝@bryanmac有用回答 我使用他的代碼作為起點,但發現不使用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];

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

困難的部分是禁用的,你不能在UIImage上設置 alpha 。 您需要在UIImageView上設置它,但按鈕不采用UIImageView ,它采用UIImage

如果你真的想這樣做,你可以在從設置了 alpha 的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];

要獲得 alpha 控制的按鈕圖像,需要做很多工作。 可能有更簡單的方法,但這就是我能找到的。 希望有幫助。

子類化 UIButton 並擴展setEnabled:方法似乎有效:

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

我還沒有徹底測試過,但確實發現如果旋轉屏幕,該值會重置。 將相同的代碼添加到setFrame:方法可以解決這個問題,但我不確定是否還有其他情況會更改此值。

如果有人需要它,這里有一個 Swift 的答案:

子類 UIButton 和覆蓋啟用

class MyCustomButton: UIButton {

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

將您想要擁有此屬性的任何按鈕的類設置為“MyCustomButton”(或您選擇的任何名稱)

 @IBOutlet weak var nextButton: MyCustomButton!

我發現這些解決方案都沒有真正奏效。 最簡潔的方法是子類化,而不是使用 self.imageView,只需添加您自己的自定義 imageView,如下所示:

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

然后像這樣添加您的自定義 alpha:

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

斯威夫特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)

按鈕的圖像視圖。 (只讀)

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

雖然這個屬性是只讀的,但它自己的屬性是讀/寫的。

- (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; [btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false;

Steph Sharp 答案的 swift 4 版本:

extension UIImage {

    func translucentImageWithAlpha(alpha: CGFloat) -> UIImage {

        UIGraphicsBeginImageContextWithOptions(self.size, false, 0.0)
        let bounds = CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)
        self.draw(in: bounds, blendMode: .screen, alpha: alpha)

        let translucentImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        return translucentImage!
    }
}

你可以這樣使用:

if let image = self.image(for: .normal) {
    self.setImage(image.translucentImageWithAlpha(alpha: 0.3), for: .disabled)
}

斯威夫特 5:

這是一個擴展 UIButton 類的解決方案。 不需要子類。 在我的示例中,如果 .isEnabled 為 false,則按鈕 alpha 設置為 0.55,如果為 true,則設置為 1.0。

擴展 UIButton {

override open var isEnabled: Bool{
    didSet {
        self.alpha = isEnabled ? 1.0 : 0.55
    }
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM