274 votes

Comment changer la couleur d’arrière-plan d’un UIButton alors qu’il ' s a mis en évidence

À un certain point, dans mon application j'ai mis en évidence UIButton (par exemple, lorsqu'un utilisateur a son doigt sur le bouton) et j'ai besoin de changer de couleur d'arrière-plan tandis que le bouton est en surbrillance (ainsi, alors que le doigt de l'utilisateur est toujours sur le bouton).

J'ai essayé le suivant :

_button.backgroundColor = [UIColor redColor];

Mais ça ne fonctionne pas. La couleur reste la même. J'ai essayé le même morceau de code lorsque le bouton n'est pas mis en évidence et il fonctionne très bien. J'ai aussi essayé d'appelé setNeedsDisplay après la modification de la couleur il n'a pas eu le moindre effet.

Comment faire pour forcer le bouton pour changer la couleur d'arrière-plan? Merci!

445voto

Thomas Decaux Points 2613

Vous pouvez substituer UIButton :

307voto

Tim Points 1104

Vous ne savez pas si ce genre d'résout ce que vous êtes après, ou correspond à votre développement général paysage, mais la première chose que je voudrais essayer serait de changer la couleur de fond du bouton sur le toucher des roues de l'événement.

Option 1: Vous auriez besoin de deux événements à la capture, UIControlEventTouchDown serait pour quand l'utilisateur appuie sur le bouton. UIControlEventTouchUpInside et UIControlEventTouchUpOutside sera pour quand ils relâchez le bouton pour revenir à l'état normal

UIButton *myButton =  [UIButton buttonWithType:UIButtonTypeCustom];
[myButton setFrame:CGRectMake(10.0f, 10.0f, 100.0f, 20.f)];
[myButton setBackgroundColor:[UIColor blueColor]];
[myButton setTitle:@"click me:" forState:UIControlStateNormal];
[myButton setTitle:@"changed" forState:UIControlStateHighlighted];
[myButton addTarget:self action:@selector(buttonHighlight:) forControlEvents:UIControlEventTouchDown];
[myButton addTarget:self action:@selector(buttonNormal:) forControlEvents:UIControlEventTouchUpInside];

Option 2:

De retour d'une image faite à partir de la mettre en évidence la couleur que vous voulez. Cela pourrait aussi être une catégorie.

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

et puis changement de la surbrillance de l'état du bouton:

[myButton setBackgroundImage:[self imageWithColor:[UIColor greenColor]] forState:UIControlStateHighlighted];

48voto

Jake Hall Points 308

En swift, vous pouvez remplacer l'accesseur de la propriété mise en évidence (ou sélectionnée) plutôt que de remplacer la méthode setHighlighted

 override var highlighted: Bool {
        get {
            return super.highlighted
        }
        set {
            if newValue {
                backgroundColor = UIColor.blackColor()
            }
            else {
                backgroundColor = UIColor.whiteColor()
            }
            super.highlighted = newValue
        }
    }
 

5voto

MattDiPasquale Points 23842

Utilisez les aides ci-dessous pour créer une image de 1 px x 1 px avec une couleur de remplissage en niveaux de gris:

 UIImage *image = ACUTilingImageGray(248/255.0, 1);
 

ou une couleur de remplissage RVB:

 UIImage *image = ACUTilingImageRGB(253/255.0, 123/255.0, 43/255.0, 1);
 

Ensuite, utilisez cette image pour définir l'image d'arrière-plan du bouton:

 [button setBackgroundImage:image forState:UIControlStateNormal];
 

Des aides

 #pragma mark - Helpers

UIImage *ACUTilingImageGray(CGFloat gray, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetGrayFillColor(context, gray, alpha);
    });
}

UIImage *ACUTilingImageRGB(CGFloat red, CGFloat green, CGFloat blue, CGFloat alpha)
{
    return ACUTilingImage(alpha, ^(CGContextRef context) {
        CGContextSetRGBFillColor(context, red, green, blue, alpha);
    });
}

UIImage *ACUTilingImage(CGFloat alpha, void (^setFillColor)(CGContextRef context))
{
    CGRect rect = CGRectMake(0, 0, 0.5, 0.5);
    UIGraphicsBeginImageContextWithOptions(rect.size, alpha == 1, 0);
    CGContextRef context = UIGraphicsGetCurrentContext();
    setFillColor(context);
    CGContextFillRect(context, rect);
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return image;
}
 

Remarque: ACU est le préfixe de classe de ma bibliothèque statique Cocoa Touch appelé Acani Utilities, où AC est destiné à Acani et U à Utilities.

2voto

Siby Points 235

essayez d'utiliser si vous avez une image

(void) setBackgroundImage: (UIImage *) image forState: (UIControlState) état;

ou voir showsTouchWhenHighlighted suffit à votre expérience

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X