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

pix*_*eak 24 iphone objective-c uibutton uiimage ios

我有一个带有图像的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];
Run Code Online (Sandbox Code Playgroud)

我该如何做到这一点?

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

Eri*_*eaf 17

如果在禁用按钮时设置alpha不起作用,则只需将您禁用的图像设置为所需的alpha值.

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

self.yourButton.alpha = 0.25;
Run Code Online (Sandbox Code Playgroud)


Ste*_*arp 14

幸得@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;
}
Run Code Online (Sandbox Code Playgroud)

将按钮的背景图像设置为禁用状态:

UIImage * disabledBgImage = [self translucentImageFromImage:originalBgImage withAlpha:0.5f];
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled];
Run Code Online (Sandbox Code Playgroud)

编辑:

我通过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;
}
Run Code Online (Sandbox Code Playgroud)

将按钮的背景图像设置为禁用状态:

UIImage * disabledBgImage = [originalBgImage translucentImageWithAlpha:0.5f];
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled];
Run Code Online (Sandbox Code Playgroud)

  • 这很有效.但它没有使用我的图像的@ 2x版本.如果你使用UIGraphicsBeginImageContextWithOptions(image.size,NO,0.0); 而不是UIGraphicsBeginImageContext(image.size)它也将支持视网膜图像. (4认同)

bry*_*mac 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];
Run Code Online (Sandbox Code Playgroud)

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


Ant*_*tox 5

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

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

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


小智 5

如果有人需要它,这里有一个 Swift 的答案:

子类 UIButton 和覆盖启用

class MyCustomButton: UIButton {

override var enabled: Bool {
    didSet{
        alpha = enabled ? 1.0 : 0.3
    }
}
Run Code Online (Sandbox Code Playgroud)

将您想要拥有此属性的任何按钮的类设置为“MyCustomButton”(或您选择的任何名称)

 @IBOutlet weak var nextButton: MyCustomButton!
Run Code Online (Sandbox Code Playgroud)