[英]How do you change UIButton image alpha on disabled state?
我有一個帶有圖像的 UIButton,在它的禁用狀態下,這個圖像應該有 0.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(可能為 0.5?)。 但我想知道如何微調這個值。
如果在按鈕禁用時設置 alpha 不起作用,那么只需將禁用的圖像設置為您想要的 alpha 值。
剛剛對此進行了測試,您可以在 UIButton 上設置 alpha,無論狀態如何,它都可以正常工作。
self.yourButton.alpha = 0.25;
感謝@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];
您需要兩個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!
我發現這些解決方案都沒有真正奏效。 最簡潔的方法是子類化,而不是使用 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)
按鈕的圖像視圖。 (只讀)
@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;
[btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false;
Steph Sharp 答案的 swift 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)
}
斯威夫特 5:
這是一個擴展 UIButton 類的解決方案。 不需要子類。 在我的示例中,如果 .isEnabled 為 false,則按鈕 alpha 設置為 0.55,如果為 true,則設置為 1.0。
擴展 UIButton {
override open var isEnabled: Bool{
didSet {
self.alpha = isEnabled ? 1.0 : 0.55
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.