如何在禁用状态下更改UIButton图像alpha?

时间:2011-09-25 00:59:49

标签: ios iphone objective-c uibutton uiimage

我有一个带有图像的UIButton,并且在禁用状态下,此图像应该具有.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];

我如何做到这一点?

UPDATE :我注意到,默认情况下,UIButton会在禁用状态下降低图像的alpha值(可能是.5?)。但我想知道如何微调这个值。

11 个答案:

答案 0 :(得分:17)

如果在按钮被禁用时设置alpha不起作用,那么只需将您的禁用图像设置为您想要的alpha值。

刚试过这个,你可以在UIButton上设置alpha,无论状态如何,它都可以正常工作。

self.yourButton.alpha = 0.25;

答案 1 :(得分:14)

对于helpful answer来说,归功于 @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];

答案 2 :(得分: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];

获得alpha控制的按钮图像需要经过很多工作。可能有一种更简单的方法,但这就是我能找到的。希望有所帮助。

答案 3 :(得分:5)

对UIButton进行子类化并扩展setEnabled:方法似乎有效:

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

我没有彻底测试过,但是如果屏幕旋转,确实发现值会重置。将相同的代码添加到setFrame:方法可以解决这个问题,但我不确定是否存在其他情况下此值已更改。

答案 4 :(得分:4)

如果有人需要,可以在Swift中找到答案:

子类UIButton和覆盖已启用

class MyCustomButton: UIButton {

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

将您要拥有此属性的任何按钮的类设置为" MyCustomButton" (或者你选择命名的任何东西)

 @IBOutlet weak var nextButton: MyCustomButton!

答案 5 :(得分:2)

按钮的图像视图。 (只读)

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

虽然此属性是只读的,但它自己的属性是可读/写的。

答案 6 :(得分:1)

我发现这些解决方案都不起作用。最干净的方法是子类化,而不是使用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;
    }
}

答案 7 :(得分:1)

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

答案 8 :(得分: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;

答案 9 :(得分:0)

Steph Sharp答案的快速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)
}

答案 10 :(得分:0)

迅速5:

这是扩展UIButton类的解决方案。无需子类。在我的示例中,如果.isEnabled为false,则按钮alpha设置为0.55;如果为true,则将按钮alpha设置为1.0。

扩展UIButton {

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

}