Pergunta

situação

Estranho - exemplos de obras de maçã, mas depois i-los a mudar um pouco, o texto não é exibido. Este pedaço de código desenha corretamente fundo azul, mas se recusa a desenhar texto sobre ele, não importa o que eu faço:

#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" );
}
Foi útil?

Solução

Eu usei o seguinte código sem problema para desenhar o texto diretamente para um contexto de quartzo:

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

Não é óbvio o que está acontecendo de errado no seu caso. Há duas coisas que atente para, neste caso: o texto pode chamar de cabeça para baixo devido ao espaço capotou coordenada UIViews e seus CALayers, e como Rítmica Fistman aponta, isso não lidar com codificações UTF

.

A melhor, embora menos eficaz, a abordagem é fazer algo como:

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

Outras dicas

Ei, eu só encontrei um bilhete no meu código.

Aparentemente CGContextShowTextAtPoint não funciona com CGContextSetFont.
Você precisa passar a usar CGContextSelectFont. Obvious, hein?

De qualquer forma, eu sei que este não é o caso, mas você pode tentar usar CGContextShowTextAtPoint.

Isso provavelmente não pertencia a uma resposta em separado.

Outras pessoas ( aqui e aqui ) ter feito algumas transformações afins e usado o método CGContextShowTextAtPoint a fim para torná-lo trabalho:

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

Um outro problema possível é que o método CGContextSetRGBFillColor leva argumentos de ponto flutuante na faixa de 0,0 a 1,0. Você está usando 255 para indicar "cores", que não é o que espera do método. O seguinte deve trabalhar, se você está mais confortável com a faixa de 0 a 255:

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

Ei, poderia ser um problema de codificação.

Tente alterar kCGEncodingFontSpecific para kCGEncodingMacRoman.

Mais tarde, quando você começa tudo de trabalho, se livrar de CGContextShowTextAtPoint.
É do lixo, não-unicode e usar as versões de glifo que você precisa para
chamar APIs proibidas. Você está muito melhor fora de usar UIKit para o desenho de texto.
É savvy unicode e também faz substituição decente glifo de caracteres
que não estão presentes na sua fonte.

Há uma outra possibilidade e isso é que a posição do texto especificado está fora do retângulo no qual você está tentando desenhar. É fácil testar essa substituindo

CGContextSetTextPosition( oContex, 100, 100 );

com

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

uso do método CGContextSetTextMatrix. O "problema de cabeça para baixo" é a partir da matriz.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top