Подтвердить что ты не робот

Как вы изменяете альфа-изображение 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?). Но я хотел бы знать, как точно настроить это значение.

4b9b3361

Ответ 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)