2010-06-27 11 views
9

Sto provando a creare un'app che si adatta bene su iPhone 4. Attualmente la maggior parte di esso si adatta perfettamente, tranne che per un elemento cruciale: il testo che disegno all'interno un CALayer, all'interno del suo drawInContext: metodo. Ecco il mio codice:Il disegno del testo di CGContext non è scalabile su 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(); 
} 

Questo breve produrre testo nitido su entrambi i dispositivi, ma purtroppo, produce il testo sfocato su entrambi. Ecco come appare:

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

Quell'immagine è presa al 100% di zoom su iPhone 4. Che cosa nel mondo? Qualche idea su come posso risolvere questo problema?

+0

questa è solo un'ipotesi da esaminare, non ho provato a vedere cosa fa. Attualmente stai usando un font 30pt, puoi testare la dimensione della stringa con font 60pt tramite (CGSize) sizeWithFont: (UIFont *) font e se la larghezza è all'interno della tua dimensione target rect quindi disegnare usando 60pt e se no disegnare usando 30pt . lo schermo iphone4 è un 2x diretto dello schermo dell'iPhone, quindi sto solo supponendo che il rendering del testo al doppio della dimensione del punto possa funzionare. – scottbates22

+0

Ciò rende solo la lettera tagliata. Vedi: http://zcr.me/01g Ancora sfocato. Solo più grande –

risposta

27

è necessario impostare il livello contentsScale di essere la stessa della scale dello schermo:

layer.contentsScale = [UIScreen mainScreen].scale; 

Questo scalerà correttamente su tutti i dispositivi iOS, Retina Display e non-Retina. Non dovresti hard-code a 2.0 (o qualsiasi altra cosa per quella materia) a meno che tu non abbia una buona ragione per farlo.

2

Poiché si ha a che fare con CALayers, è necessario impostare la proprietà contentScale del layer su 2.0.

Vedi this section nella guida di programmazione Applicazione iPhone per iOS 4.

+0

ha funzionato perfettamente! Grazie mille! –

+0

cosa succede per il display senza retina? Il testo sarà più piccolo del 50%? – thierryb

+1

Sì, apparirà sulla scala sbagliata (il che rende questa risposta errata). Per eseguire il rendering di immagini che verranno visualizzate correttamente su un display Retina o non Retina, è necessario utilizzare la proprietà '- [Scala UIScreen]' per determinare il valore corretto di 'contentsScale'. Vedi la mia risposta a questa domanda ... –

2

Il legame della risposta precedente è rotto ora. Il nuovo collegamento è this one.

+0

grazie Matsumoto –

+0

Ho aggiornato il post precedente con il tuo link –

Problemi correlati