2011-02-16 5 views
0

Ce dont j'ai besoin est un peu difficile à expliquer. Essayons ...Cocoa Couleur de texte différente dans la même lettre

Je dois écrire un texte dans mon application, et ce texte changera graduellement de couleur de gauche à droite. Je pense que je pourrais dire que c'est un effet similaire à ce que vous voyez dans un écran de karaoké.

Par exemple. Je dessine une ligne de texte, de couleur bleue, et progressivement, en utilisant une minuterie, la couleur de gauche à droite devient rouge. Mais je ne veux pas qu'il change lettre par lettre, mais progressivement. Cela exigerait qu'à un moment donné, la même lettre puisse avoir une partie en rouge et une partie en bleu.

J'ai lu sur le dessin de base, et c'est peut-être la solution, mais je ne sais vraiment pas comment commencer. Je pensais à l'aide d'un calque d'arrière-plan et en plus de dessiner un texte transparent (seulement avec la bordure), mais je ne suis pas très sûr de savoir comment le faire.

des idées seraient appréciées.

Répondre

3

Vous pouvez probablement faire le travail avec un CGLayer.

Vous devriez surtout pouvoir utiliser votre code existant pour dessiner les caractères (ou toute autre chose) dans CGLayer.

Voici un code rugueux:

// first, make a CGLayer... 

CGLayerRef yourDrawingPad = 
    CGLayerCreateWithContext(UIGraphicsGetCurrentContext(),etc.. 
CGContextRef yourRef = CGLayerGetContext(yourDrawingPad); 

// now, draw to yourRef .. draw your various typography (or anything) 
// use your current drawing code. 

// all done drawing, now make an image mask... 

UIGraphicsBeginImageContext(CGLayerGetSize(yourDrawingPad)); 
    CGContextRef temp = UIGraphicsGetCurrentContext(); 
    CGContextDrawLayerAtPoint(temp, CGPointZero, yourDrawingPad); 
    CGImageRef anAlphaMask = CGBitmapContextCreateImage(temp); 
UIGraphicsEndImageContext(); 

Vous avez maintenant un masque bien vous pouvez utiliser:

CGContextSaveGState(UIGraphicsGetCurrentContext()) ... 
CGContextClipToMask(UIGraphicsGetCurrentContext(), self.frame, anAlphaMask); 

Alors masque juste pour une image d'un gradient, ou tout ce qui fonctionne.

(On peut imaginer: peut-être vous devrez construire une image bitmap hors écran, et utiliser ensuite que le masque)

Note: Ne pas oublier qu'il est très probable que vous aurez à peindre à l'envers! Heureusement, c'est simple à gérer. Où il est dit « maintenant, attirer yourRef » avant de tirer sauver votre état et ajoutez les deux lignes de code:

CGContextTranslateCTM(refForMask, 0, self.frame.size.height); 
CGContextScaleCTM(refForMask, 1.0, -1.0); 

Hope it helps

+0

étrange. J'ai posté un commentaire et est manquant. peut-être que je ne l'ai pas ajouté correctement. Alors, c'est encore ici. Je vais essayer les deux approches. Merci pour l'aide. – Ernesto

2

J'ai une idée de la façon dont cela pourrait être fait, mais c'est plutôt complexe. Vous pouvez créer un NSBezierPath et ajouter les glyphes pour chaque caractère. Ensuite, définissez cela comme le clip et dessinez un NSGradient. Ensuite, vous devrez juste changer le décalage des couleurs dans NSGradient pour déplacer la couleur.

+0

je vais essayer. Merci. – Ernesto

Questions connexes