如何在禁用状态下更改UIButton图像alpha?
我有一个图像的UIButton和其禁用状态,这个图像应该有.3阿尔法。如何在禁用状态下更改UIButton图像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会在禁用状态(可能是.5?)下减少图像的alpha值。但我想知道如何微调这个价值。
如果在禁用按钮的情况下设置阿尔法不起作用,那么只需将您的禁用图像设置为所需的阿尔法值即可。
刚刚测试过这个,你可以在UIButton上设置alpha,而不管状态如何,它工作的很好。
self.yourButton.alpha = 0.25;
您需要两个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];
这是一个需要经过很多才能得到一个阿尔法受控按钮图像。可能有一个更简单的方法,但这是我能找到的。希望有所帮助。
谢谢@ bryanmac !! :) – Salmo
子类的UIButton和扩展setEnabled:
方法似乎工作:
- (void) setEnabled:(BOOL)enabled {
[super setEnabled:enabled];
if (enabled) {
self.imageView.alpha = 1;
} else {
self.imageView.alpha = .25;
}
}
我还没有彻底的测试,但没有找到该值重置如果屏幕旋转。将相同的代码添加到setFrame:
方法可以修复该问题,但我不确定是否还有其他情况下此值发生更改。
我发现有时这不起作用。我觉得UIButton在底层操作时会修改'imageView'(可能会在默认,选定图像之间进行切换?),并且如果在按下按钮时调用'setEnabled',则alpha值可能不会持久(例如,调用' setEnabled'而UIButton同时修改其在选定/高亮/默认状态之间的外观)。 –
然后重写'layoutSubviews'并在需要时调用'[self setNeedsLayout]'。 – Cyrille
' - (void)setEnabled:(BOOL)enabled { super.enabled = enabled; self.imageView.alpha =启用? 1:0.5; self.titleLabel.alpha = self.imageView.alpha; }' –
积分:@bryanmac他的helpful answer。我用他的代码作为出发点,但是发现同样的事情可以在不使用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];
这很好。但它没有使用我的图像的@ 2x版本。如果使用UIGraphicsBeginImageContextWithOptions(image.size,NO,0.0);而不是UIGraphicsBeginImageContext(image.size),它也会支持视网膜图像。 –
@JonHobson感谢您的提示! –
这是一个很好的答案!我现在在我的应用程序中使用它。谢谢@StephSharp! –
我发现,这些解决方案的真正的工作。这样做的最彻底的方法是继承,而不是使用self.imageView,只需添加自己的自定义ImageView的是这样的:
_customImageView = [[UIImageview alloc] initWithImage:image];
然后添加自定义的字母,像这样:
- (void)setEnabled:(BOOL)enabled {
[super setEnabled:enabled];
if (enabled) {
_customImageView.alpha = 1.0f;
} else {
_customImageView.alpha = 0.25f;
}
}
你的答案的概念是正确的。 – enadun
的按钮的图像视图。 (只读)
@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;
这是一个代码转储,没有任何有用的评论任何事情的尝试。请改善这一点。 – Drew
万一有人需要它,这里是在斯威夫特的答案:
子类的UIButton和覆盖启用
class MyCustomButton: UIButton {
override var enabled: Bool {
didSet{
alpha = enabled ? 1.0 : 0.3
}
}
设置类,你想要的任何按钮将此属性设置为“MyCustomButton”(或您选择命名的任何内容)
@IBOutlet weak var nextButton: MyCustomButton!
斯威夫特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)
你最终会找到一个解决方案? – bryanmac
我也有兴趣找到这个问题的解决方案。 – SAHM
我认为这个问题的答案是在这里添加的。 http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –