10
votes

Comment travailler autour de la pauvre rendu de texte dans le texte soutenu par une calayeuse

J'ai un texte variable dans un nstextfield qui rend sur une vue Calayer vue en arrière-plan. En tant que Calayer ne prend pas en charge l'aliasing sous-pixel pour le rendu de texte de tout texte sur le dessus, ce texte a l'air des ordures.

Un peu de googling révèle les raisons pour lesquelles ceci est, et ce texte doit être rendu sur un fond opaque pour avoir activé le spa. Le rendu sur un fond opaque est quelque chose que j'aimerais éviter si possible dans ce cas. Y a-t-il une meilleure solution de contournement?

Je suis complètement susceptible de rendre le texte moi-même dans un Nsimage , si cela vous aidera, mais je ne trouve aucun rapport confirmé qu'il le fera.

Il a l'air absolument bien dans le constructeur d'interface, donc je sais que le secret est quelque part à l'intérieur de cet ordinateur, il suffit de sortir.


4 commentaires

Pourriez-vous publier le code utilisé pour modifier la couche de NstextView?


Il y a très peu de code réel parce que je fais principalement des choses dans l'interface constructeur. Il y a un nsview qui contrôle une NSIMAGEVIE


... qui contrôle un NsimageView, avec un PNG semi-transparent. Le texte est assis sur cela.


Quiconque répond cela ne fera pas seulement la réputation, mais aussi ma gratitude éternelle. Je cherchais une solution à cela pendant des mois.


4 Réponses :


-1
votes

Quels sont les positions X, Y du texte une fois qu'elle obtient une chaîne variable remplie? J'ai eu un problème similaire pour un Uilabel qui a été causé par le fait que la position XY du texte était flotte. (Il essayait de centrer des données variables et des vals XY étaient des demi-pixels)

J'ai tronqué les valeurs et j'ai corrigé le texte flou.


1 commentaires

Nope - J'avais déjà eu la question que la vue de conteneur de contrôle est centrée, donc la moitié du temps sur le redimensionnement, il apparaîtrait à la position X.5 et à être vêtues. Ceci est purement rendu du texte, pas de positionnement.



0
votes

Je ne suis pas tout à fait sûr quelles sont vos limites, ou pourquoi vous devez absolument dessiner à une couche, mais neuf dans OS4.1 entre autres choses, texte de base a été porté à iOS du bureau. Vous pouvez probablement profiter des fonctionnalités de réglage de type avancées pour rendre des glyphes le long des lignes ou même des arcs et faire la majeure partie des fortes levées pour vous. C'est une API relativement basse de niveau, mais elle est très rapide.

- (void)drawLayer:(CALayer *)theLayer
        inContext:(CGContextRef)context
{
    CFStringRef string; CTFontRef font;  // assuming these exist

    // Initialize string, font, and context
    CFStringRef keys[] = { kCTFontAttributeName };
    CFTypeRef values[] = { font };

    CFDictionaryRef attributes =
        CFDictionaryCreate(kCFAllocatorDefault, (const void**)&keys,
            (const void**)&values, sizeof(keys) / sizeof(keys[0]),
            &kCFTypeDictionaryCallBacks,
            &kCFTypeDictionaryValueCallbacks);

    CFAttributedStringRef attrString =
        CFAttributedStringCreate(kCFAllocatorDefault, string, attributes);
    CFRelease(string);
    CFRelease(attributes);

    CTLineRef line = CTLineCreateWithAttributedString(attrString);

    // Set text position and draw the line into the graphics context
    CGContextSetTextPosition(context, 10.0, 10.0);
    CTLineDraw(line, context);
    CFRelease(line);
}


1 commentaires

Cela ne fonctionne pas car le texte de base a les mêmes limitations que le reste du quartz. Cela m'a eu sur la bonne voie, cependant.



3
votes

Solution de contournement trouvée. Rien de quartz ne peut rendre texte avec un aliasing sous-pixel sur un fond transparent, apparemment. Cependant, vous pouvez rendre du texte à un tampon bitmap offScreen, à condition que le tampon bitmap offScreen a été créé de la manière correcte. Le fond de ce tampon doit être opaque.

Mon point de vue précédemment avait un arrière-plan PNG légèrement transparent. J'aurais tout simplement pu faire ce contexte opaque et le rendu sans problème, mais comme cette vue a besoin de s'effacer et de s'effacer, elle devait être sauvegardée de Calayer, de sorte que le texte rend une fois correctement, puis rend ultérieurement des rendements sans aliasing sous-pixel .

Voici mon code. Cela semble incroyablement verbeux, j'aimerais aimer si quelqu'un pouvait m'aider à emporter. Il suppose que vous avez un NSImageView appelé _title et un nstring appelé titre . xxx


3 commentaires

AH - CGIMAGEREF Imageref = cgbitmapcontextExreateImage (contexte); est un meilleur moyen d'obtenir une image hors du contexte.


Heureux de vous entendre, vous avez compris! Je présume la raison pour laquelle il ne peut pas se fondre, c'est parce que, avec un contexte transparent, il ne saurait pas se fondre avec, d'où la raison de l'opacité.


À peu près, oui. Si c'était juste une question de chaque pixel étant argum, cela pourrait simplement le rendre comme argument et l'avoir fait avec elle, mais un aliasing sous-pixel utilise réellement Aragab, c'est-à-dire une valeur alpha pour chaque couleur plutôt que le pixel dans son ensemble.



0
votes

Voici comment l'affiche originale ne voulait pas le faire, mais c'était correct pour moi d'avoir un arrière-plan opaque ...

lorsque vous faites le calque: xxx

puis dans xxx


0 commentaires