Pour toute personne qui travaille sur un projet avec Core Animation couche adossés à des points de vue, il est malheureusement évident que les sous-pixel de l'anticrénelage (lissage de texte) est désactivé pour des textes qui ne sont pas rendus sur un arrière-plan opaque. Maintenant, pour les personnes qui sont en mesure de définir opaque horizons pour leur texte (avec un setBackgroundColor:
appel ou le paramètre équivalent dans Interface Builder), cette question n'est pas trop un problème. Pour d'autres, cependant, qui n'ont absolument aucun moyen de le contourner, ce n'est pas quelque chose que l'on peut ignorer.
J'ai été à la recherche en ligne pour bien plus de deux jours pour trouver une solution, et rien d'utilisable a venir. Tout ce que je veux faire est de créer une étiquette de texte (pas modifiable par l'utilisateur) qui est prévue sur une feuille de fenêtre (fenêtre feuille de milieux transparents, de sorte d'avoir la feuille de contenu de vue déclarer wantsLayer
comme vrai désactive le lissage de texte pour toutes les étiquettes de la fenêtre); quelque chose de très simple. J'ai vu beaucoup de contestés solutions (une rapide recherche sur Google va mettre ce sujet dans de nombreux autres endroits), mais jusqu'à présent, toutes ces solutions s'appuient sur des personnes capables et disposés à faire des compromis avec un arrière-plan opaque (vous ne pouvez pas l'utiliser sur une feuille).
Jusqu'à présent, la meilleure direction que je peux imaginer de prendre ce est pré-rendu du texte avec le lissage de texte sur une image, puis l'affichage de l'image, comme d'habitude sur une couche adossés à vue. Cependant, cela ne semble pas être possible. "Normal", je ne l'assume on pourrait faire est d'essayer cela:
NSAttributedString *string = [[self cell] attributedStringValue];
NSImage *textImage = [[NSImage alloc] initWithSize:[string size]];
[textImage lockFocus];
[string drawAtPoint:NSZeroPoint];
[textImage unlockFocus];
Mais cela ne semble pas fonctionner (le plus probable parce que, lorsqu'il est appelé à partir d' drawRect:
, le contexte graphique mis en place a déjà lissage de texte handicapés - sous-pixel de l'anticrénelage est éteint et régulière de l'antialiasing est utilisé à la place), mais aucun n'a plus de solution à cette question (où vous créez votre propre contexte graphique).
Alors, comment est en train de faire quelque chose comme cela possible? Pouvez-vous en quelque sorte de "faux" l'effet de lissage de texte? Sont là, même hack-ish solutions qui permettront d'obtenir quelque chose à configurer? Je ne veux vraiment pas avoir à abandonner Core Animation, juste à cause de cette stupide question; il y a beaucoup d'avantages à ce que d'économiser beaucoup de temps et de code.
Edit: Après beaucoup de recherche, j'ai trouvé quelque chose. Bien que le fil lui-même seulement réaffirme mes soupçons, je pense que j'ai peut-être trouvé une solution à ce problème: la coutume CALayer
dessin. Timothy Bois, dans une de ses réponses, ci-joint un exemple de projet qui montre le lissage des polices à l'aide de plusieurs techniques, plusieurs travaux. Je vais regarder dans l'intégrer dans mon projet.
Edit #2: s'avère, le lien ci-dessus est un buste ainsi. Bien que les méthodes liées donner de sous-pixel de l'antialiasing, ils ne réussissent pas aussi bien sur des arrière-plans transparents.