Créer ses propres couleurs (UIColor/NSColor)

Bonjour,
je suis en train de me demander comment faire mes propres couleurs, mais des couleurs un peu spéciale, je voudrais des dégradés (Gradient quartz 2D).
J'ai vu qu'il y avais la classe CGGradient qui permet de dessiner dans un contexte des grandients, mais le souci c'est que du coup ça oblige à  sous classé une vue pour dessiner dedans. Moi je voudrais simplement pouvoir changer le backgroundColor en gros.

J'ai vu qu'on pouvais utiliser [UIColor colorWithPatternImage:@...]; Sauf que là  je perd la transparence si j'en avais dans l'image  :(
Et puis c'est pas très souple, ça oblige à  avoir une image juste de la bonne taille sinon ça duplique l'image pour remplir ou bien au contraire ça croppe si l'image est trop grande.

Alors je me suis dit, pourquoi pas sous classer UIColor/NSColor voir même faire une Catégorie, mais là  je bloque je vois pas du tout comment faire. En gros je voudrais par programmation dire: Je veux tel couleur à  ce point puis un dégradé jusqu'à  cette autre couleur à  cet autre point.

Any idea?

Réponses

  • AliGatorAliGator Membre, Modérateur
    09:26 modifié #2
    Je crois malheureusement que tu n'as pas d'autre choix que d'utiliser Les gradients Quartz2D (Programming Guide Apple).
    Ce qui peut en effet paraà®tre étrange, dans le sens où j'aurais tendance à  te justifier ça par "car UIColor ne représente que des couleurs unies"... sauf qu'en effet il y a les "colorWithPatternImage" qui dérogent à  cette règle... Mais bon, dans tous les cas ça signifie que la couleur ou le motif (pattern) ne dépendent pas de la taille de l'objet à  "colorier", alors que pour un gradient il faut effectuer un calcul qui dépend de la taille de l'objet, et donc il faut qu'il calcule la couleur de chaque point de l'objet à  colorier, c'est pas juste une répétition d'un motif jusqu'à  épuisement.

    Tu peux toujours te faire une classe pour encapsuler le code nécessaire à  CGGradient, pour te permettre de manipuler ça de façon plus "Cocoa-esque" avec des UIColor, genre une classe GSGradient qui prendrait 2 UIColors en paramètre pour se construire et une méthode qui demande de dessiner le gradient dans le contexte graphique actuel, prenant un vecteur ou un angle en paramètre pour indiquer l'orientation du gradient à  dessiner... mais de là  à  réussir à  intégrer ça dans une catégorie de UIColor j'en doute fort.

    Il me paraà®t par exemple impossible de créer une UIColor modifiée, que tu pourrais affecter à  une propriété comme backgroundColor d'une UIView, pour réaliser un gradient. Je peux me tromper (et j'espère car en effet ça serait bien pratique) mais à  mon avis c'est pas gagné :(
  • CéroceCéroce Membre, Modérateur
    09:26 modifié #3
    Dis-nous exactement ce que tu cherches à  faire (quel est le type de vue dont tu veux changer la couleur de fond ?), nous verrons peut-être une autre solution.
    Cela dit, créer une sous-classe de UIView n'est pas très difficile.
  • GreensourceGreensource Membre
    09:26 modifié #4
    Bas j'ai réussi à  me débrouillé mais bon ma solution est pas très "reusable" quoi  :(
    En gros je fait rapidement une image de quelques pixel de large et de la longueur de la vue ou je veut mettre un background, c'est pas long mais c'est quand même moins pratique que [UIColor greyGradientColor];

    Je pensais bien à  faire a propre UIView mais ça conviens pas non plus, c'est pas du tout réutilisable, enfin je trouve pas ça très propre par rapport aux catégorie qui me semble être idéale pour ça.

    Je m'en vais écrire à  Steve, qu'il gueule un peu sur ses troupes pour qu'elles se bougent  :D
  • AliGatorAliGator Membre, Modérateur
    09:26 modifié #5
    Oui c'est l'option hybride que j'allais te proposer, coder une catégorie de UIImage qui rajouterait une méthode genre [tt]-(id)initWithGradientFromColor:(UIColor*)fromColor atPoint:(CGPoint)startPoint toColor:(UIColor*)toColor atPoint:(CGPoint)endPoint size:(CGSize)size;[/tt] pour créer une UIImage de taille [tt]size[/tt] contenant un CGGradient allant de la couleur [tt]fromColor[/tt] au point [tt]startPoint[/tt] jusqu'à  la couleur [tt]toColor[/tt] au point [tt]toPoint[/tt]. Affecter un dégradé linéaire vertical de rouge à  bleu comme fond à  une vue v se ferait donc ainsi :
    UIImage* pat = [UIImage imageWithGradientFromColor:[UIColor redColor] atPoint:CGPointZero<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; toColor:[UIColor blueColor] atPoint:CGPointMake(0,1) size:v.bounds.size];<br />v.backgroundColor = [UIColor colorWithPatternImage:pat];
    
    On peut même envisager des constructeurs de commodité comme [tt]+(id)imageWithGradientFromColor:(UIColor*)fromColor atPoint:(CGPoint)startPoint toColor:(UIColor*)toColor atPoint:(CGPoint)endPoint size:(CGSize)size;[/tt] bien sûr, mais également [tt]+(id)imageWithVerticalGradientFromColor:(UIColor*)fromColor toColor:(UIColor*)toColor size:(CGSize)size;[/tt] et [tt]+(id)imageWithHorizontalGradientFromColor:(UIColor*)fromColor toColor:(UIColor*)toColor size:(CGSize)size;[/tt]...
Connectez-vous ou Inscrivez-vous pour répondre.