33 votes

iPhone : Comment définir BackgroundColor de UIButton avec buttonType UIButtonTypeCustom ?

Je veux changer la couleur du bouton lorsqu'il est cliqué. J'ai utilisé :

[button setBackgroundColor:[UIColor redColor]];

mais la couleur rouge n'apparaît que sur les quatre coins du bouton et non sur l'ensemble du bouton. forState:UIControlStateNormal alors l'application se bloque. Existe-t-il un moyen d'afficher une couleur sur le bouton lorsqu'il est cliqué ?

[click1 setBackgroundColor:[UIColor redColor] forState:UIControlStateHighlighted];

Toute aide sera appréciée.

38voto

Hendrik Points 411

Vous pourriez créer une image de manière programmatique et ainsi avoir la possibilité d'utiliser vos couleurs de manière dynamique :

Créez une catégorie pour UIButton avec cette méthode et assurez-vous d'avoir importé la librairie QuartzCore via #import <QuartzCore/QuartzCore.h> :

- (void)setColor:(UIColor *)color forState:(UIControlState)state
{
    UIView *colorView = [[UIView alloc] initWithFrame:self.frame];
    colorView.backgroundColor = color;

    UIGraphicsBeginImageContext(colorView.bounds.size);
    [colorView.layer renderInContext:UIGraphicsGetCurrentContext()];

    UIImage *colorImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self setBackgroundImage:colorImage forState:state];
}

Cela va créer une image de la taille de votre bouton pour la couleur spécifiée et l'assigner à l'état souhaité. En raison de l'utilisation de l'image de fond, vous pouvez toujours définir un titre pour le bouton via la méthode setTitle:forState :.

14voto

Ondrej Points 1369

C'est ce que je fais ... c'est une sous-classe personnalisée d'un UIButton, il suffit de définir les couleurs normale et en surbrillance et tout devrait fonctionner correctement ;)

Fichier d'en-tête :

//
//  FTCustomButton.h
//  FTLibrary
//
//  Created by Ondrej Rafaj on 14/01/2013.
//  Copyright (c) 2013 Fuerte International. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface FTCustomButton : UIButton

@property (nonatomic, strong, readonly) UIColor *normalColor;
@property (nonatomic, strong, readonly) UIColor *highlightedColor;

- (void)setNormalColor:(UIColor *)normalColor;
- (void)setHighlightedColor:(UIColor *)highlightedColor;

@end

Il s'agit du fichier de mise en œuvre :

//
//  FTCustomButton.m
//  FTLibrary
//
//  Created by Ondrej Rafaj on 14/01/2013.
//  Copyright (c) 2013 Fuerte International. All rights reserved.
//

#import "FTCustomButton.h"

//*****************************************************************************
// private interface declaration
//*****************************************************************************
@interface MCSelectionButton ()
    @property(nonatomic, strong, readwrite) UIColor *normalColor;
    @property(nonatomic, strong, readwrite) UIColor *highlightedColor;
@end

//*****************************************************************************
// public interface implementation
//*****************************************************************************

@implementation FTCustomButton

#pragma mark Settings

- (void)setNormalColor:(UIColor *)normalColor {
    [self setBackgroundColor:normalColor];
    _normalColor = normalColor;
}

- (void)setHighlightedColor:(UIColor *)highlightedColor {
    _highlightedColor = highlightedColor;
}

#pragma mark Actions

- (void)didTapButtonForHighlight:(UIButton *)sender {
    [self setBackgroundColor:_highlightedColor];
}

- (void)didUnTapButtonForHighlight:(UIButton *)sender {
    [self setBackgroundColor:_normalColor];
}

#pragma mark Initialization

- (void)setupButton {
    [self addTarget:self action:@selector(didTapButtonForHighlight:) forControlEvents:UIControlEventTouchDown];
    [self addTarget:self action:@selector(didUnTapButtonForHighlight:) forControlEvents:UIControlEventTouchUpInside];
    [self addTarget:self action:@selector(didUnTapButtonForHighlight:) forControlEvents:UIControlEventTouchUpOutside];
}

- (id)init {
    self = [super init];
    if (self) {
        [self setupButton];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        [self setupButton];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        [self setupButton];
    }
    return self;
}

@end

13voto

DiggyJohn Points 324

Assurez-vous que le type de bouton est personnalisé comme quelqu'un d'autre l'a déjà dit. En procédant comme suit, vous retrouverez ces coins arrondis :

 [self.myButton.layer setCornerRadius:8.0f];
 [self.myButton.layer setMasksToBounds:YES];
 [self.myButton.layer setBorderWidth:1.0f];
 [self.myButton.layer setBorderColor:[[UIColor whiteColor] CGColor]];
 self.myButton.backgroundColor = [UIColor redColor];

Bien que, personnellement, je sois un grand fan des boutons en dégradé plutôt qu'en couleurs unies... De plus, la couleur de fond n'a pas d'états différents, alors que les images de fond en ont :

 [self.myButton setBackgroundImage:[UIImage imageNamed:@"gradient.png"] forState:UIControlStateNormal];

En utilisant une image, votre bouton s'assombrira avec la sélection (ou vous pourriez fournir une image de fond différente par état pour faire quelque chose de différent). Cela ne se produira pas avec la couleur d'arrière-plan, l'arrière-plan restera toujours le même, seule l'étiquette de votre bouton changeant par état.

4voto

Dima Points 10869

Je pense qu'une solution plus efficace que toutes celles citées est de dessiner l'image directement dans Core Graphics. Vous évitez ainsi d'avoir à faire un UIView et en appelant renderInContext: , ce qui peut être assez lent .

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

Vous pouvez l'utiliser dans un UIImage pour créer une image à utiliser dans une UIButton .

2voto

MGM Points 957

Pour obtenir un bouton avec une seule couleur, vous pouvez définir le bouton comme bouton personnalisé. Voici la liste des api disponibles pour les boutons (vous pouvez les définir dans viewDidLoad après les avoir définis comme points de vente). Il suffit d'importer un quartz et de modifier le rayon de la bordure pour qu'il ressemble à un bouton.

//highlightcolor - this changes the status for UIControlStateHighlighted
OUTLETNAME.tintColor =  [UIColor orangeColor];

//borderradius *quartz
[[OUTLETNAME layer] setCornerRadius:20.0f];

//border *quartz
[[OUTLETNAME layer] setBorderWidth:5.0f];

//bordercolor
[OUTLETNAME.layer setBorderColor:[[UIColor greenColor] CGColor]];

//backgroundcolor 
OUTLETNAME.backgroundColor = [UIColor blackColor];

//image 
[OUTLETNAME setImage:[UIImage imageNamed:PICNAME] forState:UIControlStateNormal];

//text 
[OUTLETNAME setTitle:@"TEXT" forState:UIControlStateNormal];

//fontsize
OUTLETNAME.titleLabel.font = [UIFont systemFontOfSize:36.0];

//fontcolor
OUTLETNAME.titleLabel.textColor = [UIColor blackColor];

//fontcolor
[OUTLETNAME setTitleColor:[UIColor orangeColor] forState: UIControlStateNormal];

Si vous voulez des boutons personnalisés avec une couleur dégradée, vous devez créer une classe de boutons personnalisée.

Ce blog propose un projet de classe de boutons brillants à télécharger. http://didikot.com/?p=217

Vous devez réfracter et convertir en ARC pour l'utiliser, je pense.

Ce blog fait la même chose, mais sans le vernis. http://www.cimgf.com/2010/01/28/fun-with-uibuttons-and-core-animation-layers/

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