2009-07-12 14 views
5

Situación extraña: ejemplos de Apple funciona, pero después de cambiarlos un poco, el texto no se muestra. Este bit de código dibuja correctamente fondo azul, pero se niega a dibujar texto en él, no importa lo que hago:iPhone: cómo dibujar texto en una ventana?

#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"); 
} 
+2

Ahora que lo veo, no creo que Monaco sea una fuente admitida en el iPhone. Pruebe Helvetica y vea si dibuja: http://www.alexcurylo.com/blog/2008/10/05/snippet-available-uifonts/ –

+0

Tiene razón. Ninguna fuente llamada 'monaco' - he probado dos fuentes más usadas en mi PC de desarrollo MacOS y no pude adivinar. Es una lástima, aunque, que CGContextSelectFont no arroje una excepción si se suministra una fuente no existente :(. Puede afirmarse en la construcción de depuración al fin. – grigoryvp

Respuesta

5

He utilizado el siguiente código sin problemas para dibujar texto directamente a un contexto de cuarzo:

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])); 

no es obvio lo que va mal en su caso. Hay dos cosas de las que hay que tener cuidado en este caso: el texto puede ponerse boca abajo debido al espacio de coordenadas volteado de UIViews y sus CALayers, y como señala Rhythmic Fistman, esto no maneja las codificaciones UTF.

Un mejor, aunque menos eficiente, el enfoque es hacer algo como:

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

[@ "abc" UTF8String] no funciona – grigoryvp

+0

por cierto, el texto en inglés en UTF-8 es binario compatible con texto en inglés en ASCII :(. – grigoryvp

+0

CGContextSelectFont no funciona correctamente para fuentes como AppleGothic ¿Sabes cómo arreglar esto? – Ganesh

1

Otras personas (here y here) han hecho algunas transformaciones afines y se utiliza el método CGContextShowTextAtPoint con el fin de hacerla trabajo:

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); 

otro posible problema es que el método CGContextSetRGBFillColor toma argumentos de coma flotante en el rango de 0,0 a 1,0. Está utilizando 255 para indicar "color completo", que no es lo que ese método espera. Lo siguiente debería funcionar, si está más cómodo con el rango de 0 a 255:

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

Cambiar 255 a 1.0f no ayuda. Añadir transformación no ayuda. – grigoryvp

1

Oye, podría ser un problema de codificación.

Intente cambiar kCGEncodingFontSpecific por kCGEncodingMacRoman.

Más tarde, cuando lo ponga todo en funcionamiento, deshágase de CGContextShowTextAtPoint.
Es basura, no es unicode y para usar las versiones de glifo necesitarás
llamar a API prohibidas. Estás mucho mejor usando UIKit para el dibujo de texto.
Es unicode inteligente y también tiene una sustitución de glifo decente para los caracteres
que no están presentes en su fuente.

+0

No funciona también. Por cierto, puedes copiar y pegar mi código, no necesitará un proyecto o algo así, simplemente compila un archivo .m único, ejecútalo y compruébalo tú mismo :) – grigoryvp

+0

No hay compilador aquí. ¿Has probado este código en un proyecto más tradicional, digamos uno con un archivo .xib? –

+0

Si esto funciona con un archivo .xib y no funcionan sin él, será una magia negra devastadora. Y seguro que debo saber POR QUÉ no está funcionando :( – grigoryvp

3

Hey, acabo de encontrar una nota en mi código.

Aparentemente CGContextShowTextAtPoint no funciona con CGContextSetFont.
En su lugar, necesita usar CGContextSelectFont. Obvio, ¿eh?

De todos modos, sé que este no es el caso, pero podría intentar usar CGContextShowTextAtPoint.

Esto probablemente no pertenecía en una respuesta separada.

+0

CGContextSelectFont es la función que estoy usando desde el inicio. Simplemente no funciona :(. Y no puedo encontrar un ejemplo de manzana lo suficientemente simple como para degradarlo en dicho código de manera significativa hora. – grigoryvp

1

Existe otra posibilidad y es que la posición del texto que especifique se encuentra fuera del rectángulo en el que está tratando de dibujar. Es fácil comprobar esta sustituyendo

CGContextSetTextPosition(oContex, 100, 100); 

con

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

método de uso CGContextSetTextMatrix.El "problema al revés" es de la matriz.