如何在禁用状态下更改UIButton图像alpha?
我有一个带有图像的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];
我该如何做到这一点?
更新 :我注意到,默认情况下,UIButton会在禁用状态下降低图像的alpha值(可能是.5?)。 但我想知道如何微调这个值。
如果在禁用按钮时设置alpha不起作用,则只需将您的禁用图像设置为所需的alpha值。
刚试过这个,你可以在UIButton上设置alpha,无论状态如何,它都可以正常工作。
self.yourButton.alpha = 0.25;
感谢@bryanmac的回答 。 我使用他的代码作为起点,但发现可以在不使用UIImageView
情况下实现相同的function。
这是我的解决方案:
- (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!
按钮的图像视图。 (只读)
@property(nonatomic, readonly, retain) UIImageView *imageView
虽然此属性是只读的,但它自己的属性是可读/写的。
我发现这些解决方案都不起作用。 最干净的方法是子类化,而不是使用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)
- (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;