2011-09-25 48 views
21

我有一个图像的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值。但我想知道如何微调这个价值。

+0

你最终会找到一个解决方案? – bryanmac

+0

我也有兴趣找到这个问题的解决方案。 – SAHM

+1

我认为这个问题的答案是在这里添加的。 http://stackoverflow.com/questions/3467119/avoiding-making-a-uibutton-transparent-see-through-when-disabling-it –

回答

15

如果在禁用按钮的情况下设置阿尔法不起作用,那么只需将您的禁用图像设置为所需的阿尔法值即可。

刚刚测试过这个,你可以在UIButton上设置alpha,而不管状态如何,它工作的很好。

self.yourButton.alpha = 0.25; 
+0

问题是准备好的图像不知道视图将会是什么它背后(这是阿尔法的点) – bryanmac

+0

我同意它是阿尔法的点,PNG支持阿尔法,所以现在怎么样与alpha使用股票图像的问题? 我一直这样做,实际上我唯一不使用它的时间是当我想在运行时动态改变alpha的淡入淡出效果。 – EricLeaf

+1

alpha PNG上的好点。同样,对于[button setAlpha],我看到它并且工作正常,唯一的问题是您或其他代码无法简单地设置按钮的状态 - 您总是必须记住设置alpha并在状态更改时重置alpha。 – bryanmac

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]; 

这是一个需要经过很多才能得到一个阿尔法受控按钮图像。可能有一个更简单的方法,但这是我能找到的。希望有所帮助。

+1

谢谢@ bryanmac !! :) – Salmo

4

子类的UIButton和扩展setEnabled:方法似乎工作:

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

我还没有彻底的测试,但没有找到该值重置如果屏幕旋转。将相同的代码添加到setFrame:方法可以修复该问题,但我不确定是否还有其他情况下此值发生更改。

+1

我发现有时这不起作用。我觉得UIButton在底层操作时会修改'imageView'(可能会在默认,选定图像之间进行切换?),并且如果在按下按钮时调用'setEnabled',则alpha值可能不会持久(例如,调用' setEnabled'而UIButton同时修改其在选定/高亮/默认状态之间的外观)。 –

+0

然后重写'layoutSubviews'并在需要时调用'[self setNeedsLayout]'。 – Cyrille

+0

' - (void)setEnabled:(BOOL)enabled { super.enabled = enabled; self.imageView.alpha =启用? 1:0.5; self.titleLabel.alpha = self.imageView.alpha; }' –

13

积分:@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]; 
+4

这很好。但它没有使用我的图像的@ 2x版本。如果使用UIGraphicsBeginImageContextWithOptions(image.size,NO,0.0);而不是UIGraphicsBeginImageContext(image.size),它也会支持视网膜图像。 –

+0

@JonHobson感谢您的提示! –

+0

这是一个很好的答案!我现在在我的应用程序中使用它。谢谢@StephSharp! –

1

我发现,这些解决方案的真正的工作。这样做的最彻底的方法是继承,而不是使用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; 
    } 
} 
+0

你的答案的概念是正确的。 – enadun

2

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

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

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

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;

+0

这是一个代码转储,没有任何有用的评论任何事情的尝试。请改善这一点。 – Drew

3

万一有人需要它,这里是在斯威夫特的答案:

子类的UIButton和覆盖启用

class MyCustomButton: UIButton { 

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

设置类,你想要的任何按钮将此属性设置为“MyCustomButton”(或您选择命名的任何内容)

@IBOutlet weak var nextButton: MyCustomButton! 
0

斯威夫特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) 
相关问题