lundi 12 mars 2012

Boutons Gradient programmatique

Merci à une peu d'insomnie, j'ai décidé de jouer un peu plus d'un bouton faisant gradient programmatiques. J'ai commencé à créer un autre bouton dégradé, s'est rendu compte que le code devait être de 90% les mêmes entre les deux boutons gradient de style, donc fait un refactoring peu. Le résultat est une classe, vous pouvez sous-classe de faire facilement des boutons de nouveau dégradé. Tout ce que vous avez à faire est remplacer trois méthodes pour spécifier le dégradé à utiliser lorsque le bouton est dans son état normal, le dégradé à utiliser lorsque le bouton est en surbrillance (pressé) État, et le rayon d'angle. Voici ce que le bouton d'alerte style ressemble maintenant:

BlueGradientButton.h
#import <UIKit/UIKit.h>
#import "AbstractGradientButton.h"

@interface BlueGradientButton : AbstractGradientButton
{
}


@end


BlueGradientButton.m
#import "BlueGradientButton.h"

@implementation BlueGradientButton
- (CGGradientRef)createNormalGradient
{
CGFloat locations[3];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:3];
UIColor *color = [UIColor colorWithRed:0.283 green:0.32 blue:0.414 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[0] = 0.0;
color = [UIColor colorWithRed:0.82 green:0.834 blue:0.87 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[1] = 1.0;
color = [UIColor colorWithRed:0.186 green:0.223 blue:0.326 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[2] = 0.483;

CGGradientRef ret = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations);
CGColorSpaceRelease(space);
return ret;
}

- (CGGradientRef)createHighlightGradient
{
CGFloat locations[4];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
NSMutableArray *colors = [NSMutableArray arrayWithCapacity:4];
UIColor *color = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[0] = 0.0;
color = [UIColor colorWithRed:0.656 green:0.683 blue:0.713 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[1] = 1.0;
color = [UIColor colorWithRed:0.137 green:0.155 blue:0.208 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[2] = 0.51;
color = [UIColor colorWithRed:0.237 green:0.257 blue:0.305 alpha:1.0];
[colors addObject:(id)[color CGColor]];
locations[3] = 0.654;

CGGradientRef ret = CGGradientCreateWithColors(space, (CFArrayRef)colors, locations);
CGColorSpaceRelease(space);
return ret;
}

- (CGFloat)cornerRadius
{
return 7.0;
}

@end



Ajout de boutons nouveau dégradé est relativement simple, puisque tout le dessin lourd est traitée dans la superclasse basée sur les valeurs que vous revenir dans ces trois méthodes. Vous pouvez consulter l'exemple de projet qui a deux boutons dégradé: celui qui simule le bouton de style alerte et qui fonctionne aussi pour les boutons de la barre régulière, et qui simule le bouton de suppression rouge. Je vais probablement ajouter des styles plus tard.

Un avis important - le CFGradientRef retournées par les deux méthodes ne devraient pas être libérés, la super classe va le libérer lorsque c'est fait. C'est un peu étrange, mais il n'y a pas de fonction CFGradientAutorelease (), seule une CFGradientRelease () fonction. J'ai changé le nom de commencer par «créer». Dans les règles de gestion de base de la Fondation de la mémoire, les fonctions qui utilisent de créer un objet avec le retour de conserver nombre de 1. Il ya probablement un moyen plus élégant pour faire face à cette situation, mais aucun produit pour moi et je ne voulais pas avoir à perdre son temps avec un rappel de libérer la mémoire étant donné la simple l'utilisation est ici.

Vous pouvez télécharger le projet ici. J'ai aussi ajouté le projet de Google Code si quelqu'un veut apporter des éléments supplémentaires.

Aucun commentaire: