Domanda

strana situazione - esempi opere di mele, ma dopo che ho cambiarle un po ', il testo non viene visualizzato. Questo pezzo di codice disegna correttamente sfondo blu, ma si rifiuta di disegnare testo su di esso, non importa quello che faccio:

#import <UIKit/UIKit.h>

@interface CWnd : UIWindow @end
@implementation CWnd

- (void) drawRect : (CGRect) i_poRect
{
  // This is working : windows is blue.
  CGContextRef oContex = UIGraphicsGetCurrentContext();
  CGContextSetRGBFillColor( oContex, 0, 0, 255, 1 );
  CGContextFillRect( oContex, i_poRect );
  // This is not working : not text is displayed.
  CGContextSelectFont( oContex, "Monaco", 10, kCGEncodingFontSpecific );
  CGContextSetRGBStrokeColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetRGBFillColor( oContex, 255, 0, 0, 1 ); 
  CGContextSetTextDrawingMode( oContex, kCGTextFill );
  CGContextSetTextPosition( oContex, 100, 100 );
  CGContextShowText( oContex, "abc", 3 );
}

@end

@interface CDelegate : NSObject <UIApplicationDelegate> @end
@implementation CDelegate

- (void)applicationDidFinishLaunching : (UIApplication *) i_poApp
{
  CGRect oRect = [ [ UIScreen mainScreen ] bounds ];
    [ [ [ CWnd alloc] initWithFrame : oRect ] makeKeyAndVisible ];
}

@end

int main(int argc, char *argv[])
{    
  return UIApplicationMain( argc, argv, nil, @"CDelegate" );
}
È stato utile?

Soluzione

Ho usato il seguente codice senza problemi per disegnare il testo direttamente in un contesto Quarzo:

CGContextSetStrokeColorWithColor(context, strokeColor); 
CGContextSetFillColorWithColor(context, strokeColor);

CGContextSelectFont(context, "Helvetica", fontSize, kCGEncodingMacRoman);
CGContextSetTextDrawingMode(context, kCGTextFill);
CGContextSetTextPosition(context, 0.0f, round(fontSize / 4.0f));
CGContextShowText(context, [text UTF8String], strlen([text UTF8String]));

Non è evidente che cosa c'è che non va nel tuo caso. Ci sono due cose da guardare fuori per in questo caso: il testo può attingere a testa in giù a causa dello spazio capovolto coordinate UIViews e loro CALayers, e come sottolinea Ritmica Fistman, questo non gestisce le codifiche UTF

.

Una migliore, anche se meno performante, approccio è quello di fare qualcosa di simile:

CGContextSetFillColorWithColor(context, strokeColor);
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]];

Altri suggerimenti

Ehi, ho appena trovato un biglietto nel mio codice.

A quanto pare CGContextShowTextAtPoint non funziona con CGContextSetFont.
È necessario utilizzare invece CGContextSelectFont. Ovvio, eh?

In ogni caso, so che questo non è il caso, ma si potrebbe provare a utilizzare CGContextShowTextAtPoint.

Questo probabilmente non apparteneva in una risposta separata.

Altre persone ( qui e qui ) hanno fatto alcune trasformazioni affini e usato il metodo CGContextShowTextAtPoint in ordine per farlo funzionare:

CGContextSelectFont(oContex, @"Monaco", 10, kCGEncodingFontSpecific);
CGContextSetTextDrawingMode(oContex, kCGTextFill);
CGContextSetRGBFillColor(oContex, 1.0, 0.0, 0.0, 1.0);
CGAffineTransform xform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(oContex, xform);
CGContextShowTextAtPoint(oContex, 100, 100, "abc", 3);

Un altro possibile problema è che il metodo CGContextSetRGBFillColor prende argomenti a virgola mobile nell'intervallo 0,0 a 1,0. Si utilizza 255 per indicare "full color", che non è quello che il metodo si aspetta. Il seguente dovrebbe funzionare, se si è più a suo agio con la gamma da 0 a 255:

CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0);

Ehi, potrebbe essere un problema di codifica.

Provare a cambiare kCGEncodingFontSpecific a kCGEncodingMacRoman.

Più tardi, quando si ottiene tutto lavoro, sbarazzarsi di CGContextShowTextAtPoint.
E 'spazzatura, non Unicode e utilizzare le versioni dei glifi che dovrete
chiamare API proibiti. Sei modo meglio usare UIKit per il disegno del testo.
E 'unicode buon senso e fa anche la sostituzione dei glifi decente per i caratteri
che non sono presenti nel vostro carattere.

C'è un'altra possibilità e cioè che la posizione del testo si specifica bugie fuori del rettangolo in cui si sta tentando di disegnare. E 'facile verificare questa sostituendo

CGContextSetTextPosition( oContex, 100, 100 );

con

CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));

utilizzare il metodo CGContextSetTextMatrix. Il "problema capovolta" è da matrice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top