web-dev-qa-db-fra.com

Comment changer la couleur en surbrillance d'un bouton UIB?

J'ai créé un bouton de navigation dans mon UINavigationController. Je le mets en surbrillance quand on le touche:

[someButton setShowsTouchWhenHighlighted:YES];

Y a-t-il un moyen de changer la couleur en surbrillance en autre chose que le blanc par défaut?

39
Code Monkey

Essayez de remplacer l'UIButton avec la méthode suivante .. et changez simplement la couleur d'arrière-plan du bouton lorsqu'il est en surbrillance.

- (void)setHighlighted:(BOOL)highlighted {
    [super setHighlighted:highlighted];

    if (highlighted) {
        self.backgroundColor = [UIColor Your Customcolor];
    }
    else{
        self.backgroundColor = [UIColor Your DefaultColor];
    }   

}

Essayez-le .. j'espère que ça aide

49
User 1531343

Vous pouvez utiliser setBackgroundImage:forState: pour définir l'image d'arrière-plan du bouton lorsqu'elle est en surbrillance.

ex:

Comme suggéré par Tim dans leur réponse ici , vous pouvez créer un UIImage à partir de UIColor:

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

Définissez ensuite l'image comme image d'arrière-plan du bouton lorsqu'elle est en surbrillance

[button setBackgroundImage:[self imageWithColor:[UIColor blueColor]] forState:UIControlStateHighlighted];

45
bradley

Dans Swift:

import UIKit

class CustomUIButtonForUIToolbar: UIButton {

    // Only override drawRect: if you perform custom drawing.
    // An empty implementation adversely affects performance during animation.
    override func drawRect(rect: CGRect) {
        // Drawing code
        super.drawRect(rect)

        self.layer.borderColor = UIColor.blueColor().CGColor
        self.layer.borderWidth = 1.0
        self.layer.cornerRadius = 5.0
        self.clipsToBounds = true
        self.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal)

        self.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Highlighted)
    }

    override var highlighted: Bool {
        didSet {

            if (highlighted) {
                self.backgroundColor = UIColor.blueColor()
            }
            else {
                self.backgroundColor = UIColor.clearColor()
            }

        }
    }

}
24
King-Wizard

Je fournirai une réponse Swift, qui peut être utilisée sans aucune personnalisation, si vous souhaitez que la couleur en surbrillance soit une version assombrie de la couleur d'arrière-plan d'origine. Si vous souhaitez par contre une couleur d'arrière-plan mise en surbrillance complètement différente, vous pouvez la fournir à la propriété en surbrillance BackgroundColor au format UIColor.

Voici le moyen le plus simple et le plus efficace de mettre en œuvre une telle fonctionnalité dans Swift. Il est également générique, ce qui signifie qu'il peut être utilisé pour un grand nombre de boutons de couleurs différentes.

Voici le code:

import UIKit

class HighlightedColorButton: UIButton {

    // A new highlightedBackgroundColor, which shows on tap
    var highlightedBackgroundColor: UIColor?
    // A temporary background color property, which stores the original color while the button is highlighted
    var temporaryBackgroundColor: UIColor?


    // Darken a color
    func darkenColor(color: UIColor) -> UIColor {

        var red = CGFloat(), green = CGFloat(), blue = CGFloat(), alpha = CGFloat()

        color.getRed(&red, green: &green, blue: &blue, alpha: &alpha)

        red = max(red - 0.5, 0.0)
        green = max(green - 0.5, 0.0)
        blue = max(blue - 0.5, 0.0)

        return UIColor(red: red, green: green, blue: blue, alpha: alpha)
    }


    // Set up a property observer for the highlighted property, so the color can be changed
    @objc override var highlighted: Bool {
        didSet {
            if highlighted {
                if temporaryBackgroundColor == nil {
                    if backgroundColor != nil {
                        if let highlightedColor = highlightedBackgroundColor {
                            temporaryBackgroundColor = backgroundColor
                            backgroundColor = highlightedColor
                        } else {
                            temporaryBackgroundColor = backgroundColor
                            backgroundColor = darkenColor(temporaryBackgroundColor!)
                        }
                    }
                }
            } else {
                if let temporaryColor = temporaryBackgroundColor {
                    backgroundColor = temporaryColor
                    temporaryBackgroundColor = nil
                }
            }
        }
    }
}

Traitez le bouton comme un bouton UIB normal, avec l’ajout de la propriété facultative en surbrillanceBackgroundColor:

let highlightedColorButton = HighlightedColorButton.buttonWithType(.Custom) as HighlightedColorButton
highlightedColorButton.backgroundColor = UIColor.redColor()
highlightedColorButton.highlightedBackgroundColor = UIColor.blueColor()
4
ArVID220u

Utilisez cette instruction pour définir la couleur en surbrillance de l'UIButton:

[button setTitleColor:[UIColor redColor] forState:UIControlStateHighlighted];
2
Vinay Jain

Dans Swift, si vous souhaitez utiliser une image pour l’état mis en surbrillance, vous pouvez le faire avec UIButton:

if enabled {
 //highlighted state
     enableMicrophone.setImage(UIImage(named: "mic_on"), forState: .Highlighted)
 } else {
 //normal state
     enableMicrophone.setImage(UIImage(named: "mic_off"), forState: .Normal)    
}
1
CodeOverRide

Je réussis en utilisant un vieux truc Web.

J'ai créé quelques ressources d'image dans images.xcassets, Fichiers PNG, les deux 1px par 1px. L'un est la couleur normale, l'autre est la couleur de fond.

Je vais du noir pur au blanc pur, alors:

Dans le storyboard, je sélectionne le bouton. Dans "Inspecteur d'attributs" (panneau de droite, 4ème icône en face), je change le type en "personnalisé", modifie la "configuration d'état" en "surbrillance", puis "en arrière-plan" en "whitePixel" (ou ce que vous avez appelé ) et 'Couleur du texte' à 'Couleur noire'.

Maintenant, je change la "configuration d'état" en "Par défaut", le "fond" en "blackPixel" (ou autre) et la "Couleur du texte" en "couleur blanche".

Je suppose que vous pouvez utiliser ces pixels chaque fois que vous devez appliquer une couleur lorsque vous n’avez accès qu’aux images dans l’éditeur Storyboard.

Cela augmente le nombre d'actifs d'image, mais réduit considérablement le code requis. Ce qui me plait.

0
A Fader Darkly