94 votes

Comment faire en sorte que le texte d'un CATextLayer soit clair ?

J'ai fait un CALayer avec un ajout CATextLayer et le texte est flou. Dans la documentation, ils parlent d'un "anticrénelage sous-pixel", mais cela ne veut pas dire grand chose pour moi. Quelqu'un a t-il un extrait de code qui fait un CATextLayer avec un bout de texte qui est clair ?

Voici le texte de la documentation d'Apple :

Remarque : CATextLayer désactive l'anticrénelage sous-pixel lors du rendu du texte. Le texte ne peut être dessiné en utilisant l'anticrénelage sous-pixel que lorsqu'il est lorsqu'il est composé dans un arrière-plan opaque existant en même temps que le texte. qu'il est rastérisé. Il n'y a aucun moyen de dessiner du texte avec anticrénelage sous-pixel par lui-même, que ce soit dans une image ou dans un tableau. par lui-même, que ce soit dans une image ou un calque, séparément avant le avant de disposer des pixels d'arrière-plan dans lesquels tisser les pixels du texte. Le réglage de la propriété d'opacité du calque sur OUI ne change pas le mode de rendu. de rendu.

La deuxième phrase implique que l'on peut obtenir un texte de bonne qualité si l'on composites dans un existing opaque background at the same time that it's rasterized. C'est génial, mais comment le composer, comment lui donner un fond opaque et comment le rastériser ?

Le code qu'ils utilisent dans leur exemple de menu kiosque est le suivant : (C'est OS X, pas iOS, mais je suppose que cela fonctionne !)

NSInteger i;
for (i=0;i<[names count];i++) {
    CATextLayer *menuItemLayer=[CATextLayer layer];
    menuItemLayer.string=[self.names objectAtIndex:i];
    menuItemLayer.font=@"Lucida-Grande";
    menuItemLayer.fontSize=fontSize;
    menuItemLayer.foregroundColor=whiteColor;
    [menuItemLayer addConstraint:[CAConstraint
         constraintWithAttribute:kCAConstraintMaxY
                      relativeTo:@"superlayer"
                       attribute:kCAConstraintMaxY
                          offset:-(i*height+spacing+initialOffset)]];
    [menuItemLayer addConstraint:[CAConstraint
         constraintWithAttribute:kCAConstraintMidX
                      relativeTo:@"superlayer"
                       attribute:kCAConstraintMidX]];
    [self.menuLayer addSublayer:menuItemLayer];
} // end of for loop 

Gracias.


EDIT : Ajout du code que j'ai effectivement utilisé et qui a donné lieu à un texte flou. Il provient d'une question connexe que j'ai postée au sujet de l'ajout d'une balise UILabel plutôt qu'un CATextLayer mais en obtenant une boîte noire à la place. http://stackoverflow.com/questions/3818676/adding-a-uilabels-layer-to-a-calayer-and-it-just-shows-black-box

CATextLayer* upperOperator = [[CATextLayer alloc] init];
CGColorSpaceRef space = CGColorSpaceCreateDeviceRGB();
CGFloat components1[4] = {1.0, 1.0, 1.0, 1.0};
CGColorRef almostWhite = CGColorCreate(space,components1);
CGFloat components2[4] = {0.0, 0.0, 0.0, 1.0};
CGColorRef almostBlack = CGColorCreate(space,components2);
CGColorSpaceRelease(space);
upperOperator.string = [NSString stringWithFormat:@"13"];
upperOperator.bounds = CGRectMake(0, 0, 100, 50);
upperOperator.foregroundColor = almostBlack;
upperOperator.backgroundColor = almostWhite;
upperOperator.position = CGPointMake(50.0, 25.0);
upperOperator.font = @"Helvetica-Bold";
upperOperator.fontSize = 48.0f;
upperOperator.borderColor = [UIColor redColor].CGColor;
upperOperator.borderWidth = 1;
upperOperator.alignmentMode = kCAAlignmentCenter;
[card addSublayer:upperOperator];
[upperOperator release];
CGColorRelease(almostWhite);
CGColorRelease(almostBlack);

EDIT 2 : Voir ma réponse ci-dessous pour savoir comment cela a été résolu. sbg.

0 votes

Cela ne répondra pas à votre question, mais peut être pertinent pour quelqu'un comme moi qui cherche seulement à dessiner du texte attribué, d'une manière très similaire à l'utilisation de UILabel : stackoverflow.com/questions/3786528/

4voto

james_alvarez Points 342

Si vous avez cherché ici un problème similaire pour un CATextLayer dans OSX, après beaucoup de coups de tête, j'ai obtenu un texte clair et net en faisant ce qui suit :

text_layer.contentsScale = self.window!.backingScaleFactor

(J'ai également défini la même échelle pour le contenu de la couche d'arrière-plan des vues).

0voto

Alejandro Luengo Points 433

C'est plus rapide et plus simple : il suffit de définir contentsScale

    CATextLayer *label = [[CATextLayer alloc] init];
    [label setFontSize:15];
    [label setContentsScale:[[UIScreen mainScreen] scale]];
    [label setFrame:CGRectMake(0, 0, 50, 50)];
    [label setString:@"test"];
    [label setAlignmentMode:kCAAlignmentCenter];
    [label setBackgroundColor:[[UIColor clearColor] CGColor]];
    [label setForegroundColor:[[UIColor blackColor] CGColor]];
    [self addSublayer:label];

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X