Как вы изменяете изображение UIButton alpha при отключенном состоянии? - PullRequest
23 голосов
/ 25 сентября 2011

У меня есть UIButton с изображением и в его отключенном состоянии, это изображение должно иметь .3 альфа.

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

Ответы [ 10 ]

17 голосов
/ 25 сентября 2011

Если настройка альфа, когда кнопка отключена, не работает, тогда просто сделайте ваше отключенное изображение с желаемым значением альфа.

Только что протестировав это, вы можете установить альфа на UIButton, независимо отсостояние, и это работает просто отлично.

self.yourButton.alpha = 0.25;
14 голосов
/ 28 февраля 2014

Кредит идет к @ 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];
7 голосов
/ 25 сентября 2011

Вам нужно два экземпляра UIImage, один для включенного и один для отключенного.

Трудная часть для отключенного, вы не можете установить альфа на 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];

Это очень много, чтобы получить изображение кнопки, контролируемой альфа.Возможно, есть более простой способ, но это все, что я смог найти.Надеюсь, это поможет.

5 голосов
/ 30 апреля 2012

Создание подкласса UIButton и расширение метода setEnabled:, кажется, работает:

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

Я не проверил его полностью, но нашел сброс значений при повороте экрана.Добавление того же кода в метод setFrame: исправляет это, но я не уверен, что есть другие ситуации, когда это значение изменяется.

4 голосов
/ 20 августа 2016

Если кому-то это нужно, вот ответ в Swift:

Подкласс UIBКнопка и переопределение включены

class MyCustomButton: UIButton {

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

Установите класс любой кнопки, для которой вы хотите, чтобы это свойство имело значение «MyCustomButton» (или как вы его называете)

 @IBOutlet weak var nextButton: MyCustomButton!
2 голосов
/ 27 октября 2017

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)
2 голосов
/ 17 августа 2014

Просмотр изображения кнопки. (Только для чтения)

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

Хотя это свойство доступно только для чтения, его собственные свойства доступны для чтения и записи.

2 голосов
/ 23 мая 2014

Я обнаружил, что ни одно из этих решений действительно не работает. Самый чистый способ сделать это - создать подкласс, и вместо использования 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 голосов
/ 13 ноября 2018

Быстрая 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)
}
0 голосов
/ 06 января 2016
- (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;

...