我有一个带有图像的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?)。但我想知道如何微调这个值。
答案 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
}
}
}