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" );
}
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top