11
votes

Drawrect dessin du texte "transparent"?

Je cherche à dessiner un Uilabel (préférable au sous-classement) comme une étiquette transparente, mais avec un fond solide. J'attire un exemple rapide (désolé, c'est laid, mais cela obtient les points sur :)).

Fondamentalement, j'ai un Uilabel et je voudrais que l'arrière-plan soit une couleur définie et que le texte soit transparent. Je ne veux pas colorer le texte avec le fond de vues, mais il est à la place de 100% transparent, car j'ai une texture à l'arrière-plan que je veux assurer des lignes à l'intérieur et à l'extérieur de l'étiquette.

Je passe la nuit à la navigation de la nuit et je cherche sur Google, mais je n'ai trouvé aucune source utile. Je n'ai pas beaucoup d'expérience avec le dessin CG, alors j'apprécierais des liens, de l'aide, du tutoriel ou du code de l'échantillon (peut-être que Apple a quelques-unes, j'ai besoin de regarder?).

Merci un tas!

Entrez la description de l'image ici


2 commentaires

Jusqu'à présent, de la plongée plus loin dans les documents de quartz passionnants, je pense que je dois utiliser cgcontextsettertextDrawingMode et kcgtextclip


Voir ma réponse à Stackoverflow.com/questions/19787238/... Pour une approche basée sur un chemin de ce problème.


4 Réponses :


4
votes

résolu en utilisant des masques de calayer. La création d'un masque standard (texte de papier peint, par exemple) est simple. Pour créer le texte assommé, je devais inverser le canal alpha de mon masque, qui impliquait rendant une étiquette à un CGIMageref, puis faire quelques pixels de pixels.

 masque d'échantillon

exemple application est disponible ici: https://github.com/robinsenior/rsmaskedlabel

Code concerné est ici pour éviter la future lien-pourriture: xxx


0 commentaires

4
votes

Voici une technique similaire à celle de Matt Gallagher, qui générera un masque de texte inversé avec une image.

allouer un tampon de données (mutable). Créez un contexte bitmap avec un canal alpha 8 bits. Configurez les paramètres pour le dessin du texte. Remplissez le tampon entier en mode copie (la couleur par défaut supposée avoir une valeur alpha de 1). Écrivez le texte en mode clair (valeur alpha de 0). Créez une image dans le contexte bitmap. Utilisez le bitmap comme masque pour créer une nouvelle image de l'image source. Créez une nouvelle uiimage et nettoyer. P>

Chaque fois que les valeurs de textustring ou de la tailleImage ou de taille changent, réinduisent l'image finale. P>

CALayer *maskLayer = [[CALayer alloc] init];
CGPoint position = CGPointZero;

// layout the new layer
position = overlay.layer.position;
position.y *= 0.5f;
maskLayer.bounds = overlay.layer.bounds;
maskLayer.position = position;
maskLayer.contents = (__bridge id)textImage;

self.layer.mask = maskLayer;


1 commentaires

La nouvelle réponse de Robin Senior est la meilleure réponse, maintenant!



13
votes

J'ai réécrit comme une sous-classe Uilabel en utilisant à peine n'importe quel code et l'a posté sur Github

Le gist de celui-ci est que vous remplacez le drawrect mais appelez [super drawrect: rect] pour laisser l'Uilabel rendu comme normal. L'utilisation d'une couleur d'étiquette blanche vous permet d'utiliser facilement l'étiquette elle-même comme masque. xxx


0 commentaires

0
votes

STROIFT 5 SOLUTION (XCODE: 12.5):

 Entrez la description de l'image ici xxx


0 commentaires