Question

J'étend la classe UIButton pour pouvoir définir la police et la couleur de UINavigationBarButton (à partir de cet exemple de code: activer le code )

Je vais comme ça:

@interface NavBarButtonGrey : UIButton 
-(id)init;

@end


@implementation NavBarButtonGrey

-(id)init {
if(self = [super init]) {
    self.frame = CGRectMake(0, 0, 49.0, 30.0);
    self.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
    self.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;

    UIImage *image = [UIImage imageNamed:@"greyNavButton.png"];
    UIImage *stretchImage = 
    [image stretchableImageWithLeftCapWidth:15.0 topCapHeight:0.0];
    [self setBackgroundImage:stretchImage forState:UIControlStateNormal];
    self.backgroundColor = [UIColor clearColor];
    [self setTitleShadowColor:[UIColor blackColor] forState:UIControlStateNormal];
    self.titleShadowOffset = CGSizeMake(0, -1);
    self.titleLabel.font = [UIFont boldSystemFontOfSize:13];
}

return self;
}
@end

C’est bien, mais bien sûr pas très flexible. Comment puis-je intégrer en utilisant un ened typedef (comme Apple le fait) pour tous les différents couleurs, polices et tailles que je souhaite que mon bouton personnalisé respecte.

La seule chose que je peux extraire des fichiers d'interface de UIKit, c'est que cela se fait comme suit:

typedef enum {
RGCustomNavBarButtonStyleBlue,
RGCustomNavBarButtonStyleGrey,
RGCustomNavBarButtonStyleBlack,
RGCustomNavBarButtonStyleGreen,
RGCustomNavBarButtonStyleRed, 
} RGCustomNavBarButtonStyle;

Comment passer de cela à une implémentation fonctionnelle qui prend la police, la taille, la couleur, etc. des valeurs de l’énum en passant par le constructeur (initWithStyle)?

Est-ce qu'on surcharge les constructeurs dans Objective C? plusieurs constructeurs?

J'espère que cela a du sens et merci pour toute aide apportée:)

Était-ce utile?

La solution

Vous pouvez avoir plusieurs constructeurs tels que;

-(MyClass) initWithFont: (UIFont) font;
-(MyClass) initWithFonmt: (UIFont) font andColor: (UIColor) color;

etc.

Appelez ensuite [super init] en tant que première ligne de chacun de vos constructeurs personnalisés.

Autres conseils

Pour développer ce que ennuikiller a dit plus haut, on m'a appris (dans le livre de Hillegass) à choisir un initialiseur - généralement celui qui offre le plus d'options, comme votre initWithFont: andColor: - et à ce que les autres initialiseurs l'appellent. Cet initialiseur principal est appelé l'initialiseur désigné.

Ainsi, votre code aurait un initWithFont: andColor: entièrement appelé, qui appelle [super init], puis un initWithFont: ressemblant à ceci:

-(MyClass) initWithFont: (UIFont) font
{
    [self initWithFont:font andColor:RGCustomNavBarButtonStyleBlack];
}

Ensuite, votre initWithFont: andColor: gérera toutes les autres configurations et appellera [super init].

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top