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 :)). P>
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. P>
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?). P>
Merci un tas! p>
p>
4 Réponses :
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.
p>
exemple application est disponible ici: https://github.com/robinsenior/rsmaskedlabel P>
Code concerné est ici pour éviter la future lien-pourriture: p>
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;
La nouvelle réponse de Robin Senior est la meilleure réponse, maintenant!
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] code> 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. P>
Jusqu'à présent, de la plongée plus loin dans les documents de quartz passionnants, je pense que je dois utiliser
cgcontextsettertextDrawingMode code> et
kcgtextclip code>
Voir ma réponse à Stackoverflow.com/questions/19787238/... Pour une approche basée sur un chemin de ce problème.