web-dev-qa-db-fra.com

Comment modifiez-vous l'image UIButton alpha en état désactivé?

J'ai un UIButton avec une image et sur son état désactivé, cette image devrait avoir .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];

Comment puis-je accomplir ceci?

UPDATE: J'ai remarqué que, par défaut, UIButton réduit l'alpha de l'image en état désactivé (probablement à 0,5?). Mais j'aimerais savoir comment ajuster cette valeur.

21
pixelfreak

Si le réglage de l'alpha alors que le bouton est désactivé ne fonctionne pas, créez simplement votre image désactivée à la valeur alpha souhaitée.

Vient de tester cela, vous pouvez définir l'alpha sur le UIButton, indépendamment de l'état et cela fonctionne très bien.

self.yourButton.alpha = 0.25;
16
EricLeaf

Le mérite revient à @bryanmac pour sa réponse utile . J'ai utilisé son code comme point de départ, mais j'ai constaté que la même chose pouvait être obtenue sans utiliser UIImageView.

Voici ma solution:

- (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;
}

Définissez l'image d'arrière-plan du bouton pour l'état désactivé:

UIImage * disabledBgImage = [self translucentImageFromImage:originalBgImage withAlpha:0.5f];
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled];

MODIFIER: 

J'ai peaufiné ma solution en créant une catégorie sur UIImage avec cette méthode:

- (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;
}

Définissez l'image d'arrière-plan du bouton pour l'état désactivé:

UIImage * disabledBgImage = [originalBgImage translucentImageWithAlpha:0.5f];
[button setBackgroundImage:disabledBgImage forState:UIControlStateDisabled];
14
Steph Sharp

Vous avez besoin de deux instances de UIImage, une pour activé et une pour désactivé.

La partie difficile est pour le handicapé, vous ne pouvez pas définir alpha sur UIImage. Vous devez le définir sur UIImageView mais le bouton ne prend pas un UIImageView, il prend un UIImage.

Si vous voulez vraiment faire cela, vous pouvez charger la même image dans l'état du bouton désactivé après avoir créé une image résultante à partir de la UIImageView sur laquelle l'alpha est défini.

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];

C'est beaucoup à faire pour obtenir une image de bouton à contrôle alpha. Il y a peut-être un moyen plus facile mais c'est tout ce que j'ai pu trouver. J'espère que cela pourra aider.

7
bryanmac

Sous-classer UIButton et étendre la méthode setEnabled: semble fonctionner:

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

Je ne l'ai pas testé de manière approfondie, mais la valeur a été réinitialisée si l'écran est pivoté. L'ajout du même code à la méthode setFrame: corrige ce problème, mais je ne suis pas sûr s'il existe d'autres situations dans lesquelles cette valeur est modifiée.

5
Anthony Mattox

Au cas où quelqu'un en aurait besoin, voici une réponse dans Swift:

Sous-classe UIButton et substitution activés

class MyCustomButton: UIButton {

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

Définissez la classe de n'importe quel bouton pour lequel vous souhaitez que cette propriété soit "MyCustomButton" (ou le nom de votre choix)

 @IBOutlet weak var nextButton: MyCustomButton!
4
Kay

La vue image du bouton. (lecture seulement)

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

Bien que cette propriété soit en lecture seule, ses propres propriétés sont en lecture/écriture.

2
dahe

J'ai trouvé qu'aucune de ces solutions ne fonctionne vraiment. La façon la plus propre de le faire est de sous-classer, et au lieu d'utiliser self.imageView, ajoutez simplement votre propre imageView personnalisée comme ceci:

_customImageView = [[UIImageview alloc] initWithImage:image];

Ajoutez ensuite votre alpha personnalisé comme suit:

- (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
    }
}

Usage: 

button.setImage(image.copy(alpha: 0.3), for: .disabled)
1
sash

Une version Swift 4 de la réponse de Steph Sharp:

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!
    }
}

Que vous pouvez utiliser comme ceci:

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; }

Utilisez: [btnRegister setBackgroundImage:[self imageWithColor:[UIColor lightGrayColor]] forState:UIControlStateDisabled]; btnRegister.enabled = false;

0
Raul Quispe