iPhone: cómo dibujar texto en una ventana?
Pregunta
Extraño situación - Ejemplos de trabajos de manzana, pero después de las cambio un poco, no se muestra el texto. Este bit de código dibuja correctamente fondo azul, pero se niega a dibujar texto en él, no importa lo que hago:
#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" );
}
Solución
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 a tener en cuenta en este caso: el texto puede llamar al revés debido al espacio de coordenadas del volteada UIViews y sus CALayers, y como señala rítmica Fistman, esto no maneja codificaciones UTF
.Una 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]];
Otros consejos
Hola, acabo de encontrar una nota en mi código.
Al parecer CGContextShowTextAtPoint
no funciona con CGContextSetFont
.
Es necesario utilizar en lugar CGContextSelectFont
. Obvio, ¿verdad?
De todos modos, sé que esto no es el caso, pero se puede tratar de usar CGContextShowTextAtPoint
.
Esto probablemente no pertenecía en una respuesta por separado.
aquí y aquí ) han hecho algunas transformaciones afines y se utiliza el método con el fin CGContextShowTextAtPoint
para que funcione:
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 "a todo color", que no es lo que el método espera. El siguiente debe funcionar, si se siente más cómodo con el rango de 0 a 255:
CGContextSetRGBFillColor(oContex, 255/255.0, 0/255.0, 0/255.0, 1.0);
Hey, podría ser un problema de codificación.
Trate de cambiar kCGEncodingFontSpecific
a kCGEncodingMacRoman
.
Más tarde, cuando usted lo consigue todo de trabajo, deshacerse de CGContextShowTextAtPoint
.
Es basura, no Unicode y el uso de las versiones de glifos que necesitará para
llamar a las API prohibidas. Usted es manera mejor de usar UIKit para dibujar texto.
Es inteligente Unicode y también lo hace la sustitución glifo decente para de Carácter
que no están presentes en su fuente.
Hay otra posibilidad, y es que la posición del texto se especifica encuentra fuera del rectángulo en el que usted está tratando de dibujar. Es fácil comprobar esta sustituyendo
CGContextSetTextPosition( oContex, 100, 100 );
con
CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));
utilizar el método CGContextSetTextMatrix. El "problema al revés" es de matriz.