it-swarm.com.ru

Как вы изменяете изображение UIButton alpha при отключенном состоянии?

У меня есть 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];

Как мне это сделать?

UPDATE: Я заметил, что по умолчанию UIButton действительно уменьшает альфа изображения в отключенном состоянии (вероятно, в .5?). Но я хотел бы знать, как точно настроить это значение.

21
pixelfreak

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

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

self.yourButton.alpha = 0.25;
16
EricLeaf

Автор благодарен @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];
14
Steph Sharp

Вам нужно два экземпляра 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];

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

7
bryanmac

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

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

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

5
Anthony Mattox

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

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

class MyCustomButton: UIButton {

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

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

 @IBOutlet weak var nextButton: MyCustomButton!
4
Kay

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

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

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

2
dahe

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

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)
1
sash

Версия 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)
}
0
Pochi
- (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
Raul Quispe