2010-06-27 13 views
9

J'essaie de créer une application qui évolue bien sur l'iPhone 4. Actuellement, la plupart d'entre elle se reproduit parfaitement, sauf pour une pièce cruciale: le texte que je dessine à l'intérieur un CALayer, à l'intérieur de sa méthode drawInContext: Voici mon code:CG Le dessin du texte contextuel ne passe pas à l'échelle sur l'iPhone 4

- (void)drawInContext:(CGContextRef)context { 
    UIGraphicsPushContext(context); 

    CGContextSetGrayFillColor(context, 1.0f, 1.0f); 
    CGContextFillRect(context, self.bounds); 

    CGContextSetAllowsAntialiasing(context, true); 
    CGContextSetShouldAntialias(context, true); 

    CGContextSetAllowsFontSmoothing(context, true); 
    CGContextSetShouldSmoothFonts(context, true); 

    CGContextSetAllowsFontSubpixelQuantization(context, true); 
    CGContextSetShouldSubpixelQuantizeFonts(context, true); 

    CGContextTranslateCTM(context, 0.0f, self.frame.size.height); 
    CGContextScaleCTM(context, 1.0f, -1.0f); 

    CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]); 
    CGContextSelectFont(context, "CardKit", 30.0f, kCGEncodingMacRoman); 
    CGContextSetTextDrawingMode(context, kCGTextFill); 
    CGContextShowText(context, "A", sizeof("A")); 

    UIGraphicsPopContext(); 
} 

Ce court produit des textes nets sur les deux appareils, mais malheureusement, il produit un texte flou sur les deux. Voici comment il apparaît:

ugly text http://files.droplr.com.s3.amazonaws.com/files/16285043/1gBp61.Screen%20shot%202010-06-26%20at%2021:25:09.png

Cette image est prise au zoom 100% sur l'iPhone 4. Que dans le monde? Des idées comment je peux résoudre ce problème?

+0

c'est juste une supposition à regarder, je n'ai pas essayé de voir ce qu'il fait. Vous utilisez actuellement la police 30pt, vous pouvez tester la taille de la chaîne avec la police 60pt via la police (CGSize) sizeWithFont: (UIFont *) et si la largeur est dans votre taille cible rect puis dessiner en utilisant 60pt et sinon dessiner en utilisant 30pt . l'écran iphone4 est un 2x direct de l'écran de l'iphone, donc je devine juste que le texte de rendu à deux fois la taille du point pourrait fonctionner. – scottbates22

+0

Cela ne fait que couper la lettre. Voir: http://zcr.me/01g Toujours flou. Juste plus gros. –

Répondre

27

Vous devez définir d'être le même que le scale de votre écran contentsScale de la couche:

layer.contentsScale = [UIScreen mainScreen].scale; 

Cela l'échelle correctement sur tous les appareils iOS, Retina Display et affichage non Retina. Vous ne devriez pas le coder en dur à 2.0 (ou toute autre chose d'ailleurs) à moins que vous n'ayez une bonne raison de le faire.

2

Étant donné que vous traitez avec CALayers, vous devez définir la propriété contentsScale de votre couche sur la version 2.0.

Voir this section dans le guide de programmation d'application iPhone pour iOS 4.

+0

A travaillé parfaitement! Merci beaucoup! –

+0

que se passe-t-il pour l'affichage non rétine? Le texte sera-t-il 50% plus petit? – thierryb

+1

Oui, il apparaîtra à la mauvaise échelle (ce qui rend cette réponse incorrecte). Pour afficher des images qui s'afficheront correctement sur un écran Retina ou non-Retina, vous devez utiliser la propriété '- [UIScreen scale]' pour déterminer la valeur correcte de 'contentsScale'. Voir ma réponse à cette question ... –

2

Le lien de la réponse précédente est maintenant brisée. Le nouveau lien est this one.

+0

merci Matsumoto –

+0

J'ai mis à jour le post ci-dessus avec votre lien –