Как вы изменяете альфа-изображение UIButton в отключенном состоянии?
У меня есть 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 уменьшает альфа изображения в отключенном состоянии (возможно, на .5?). Но я хотел бы знать, как точно настроить это значение.
Ответы
Ответ 1
Если настройка альфа, когда кнопка отключена, не работает, просто создайте отключенное изображение с желаемым значением альфа.
Просто протестировав это, вы можете установить альфа на UIButton, независимо от состояния, и он работает нормально.
self.yourButton.alpha = 0.25;
Ответ 2
Кредит идет @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];
EDIT:
Я уточнил свое решение, создав категорию 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];
Ответ 3
Вам нужны два экземпляра UIImage
, один для включенного и один для отключенного.
Жесткая часть для отключенного, вы не можете установить alpha на 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];
Это много, чтобы получить изображение с управляемой альфа-кнопкой. Может быть, проще, но все, что я мог найти. Надеюсь, что это поможет.
Ответ 4
Подклассификация UIButton и расширение метода setEnabled:
работают:
- (void) setEnabled:(BOOL)enabled {
[super setEnabled:enabled];
if (enabled) {
self.imageView.alpha = 1;
} else {
self.imageView.alpha = .25;
}
}
Я не тестировал его полностью, но нашел, что значение сбрасывается, если экран повернут. Добавление того же кода в метод setFrame:
исправляет это, но я не уверен, что есть другие ситуации, когда это значение изменяется.
Ответ 5
Если кому-то это понадобится, вот ответ в Swift:
Подкласс UIButton и переопределение включено
class MyCustomButton: UIButton {
override var enabled: Bool {
didSet{
alpha = enabled ? 1.0 : 0.3
}
}
Задайте класс любой кнопки, которую вы хотите присвоить этому свойству, в "MyCustomButton" (или все, что вы хотите назвать)
@IBOutlet weak var nextButton: MyCustomButton!
Ответ 6
Вид изображения кнопок. (Только для чтения)
@property(nonatomic, readonly, retain) UIImageView *imageView
Хотя это свойство доступно только для чтения, его собственные свойства читаются/записываются.
Ответ 7
Я обнаружил, что ни одно из этих решений действительно не работает. Самый чистый способ сделать это - подкласс, и вместо использования 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;
}
}
Ответ 8
- (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
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)