iPhone: как нарисовать текст в окне? - PullRequest
5 голосов
/ 12 июля 2009

Странная ситуация - примеры от apple работают, но после того, как я немного их изменил, текст не отображается. Этот фрагмент кода правильно рисует синий фон, но отказывается рисовать на нем текст независимо от того, что я делаю:

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

Ответы [ 6 ]

5 голосов
/ 12 июля 2009

Я без проблем использовал следующий код для рисования текста непосредственно в контексте Quartz:

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

Не очевидно, что происходит в вашем случае. В этом случае следует обратить внимание на две вещи: текст может рисоваться вверх ногами из-за перевернутого координатного пространства UIViews и их CALayers, и, как указывает Rhythmic Fistman, это не обрабатывает кодировки UTF.

Лучший, хотя и менее производительный подход - сделать что-то вроде:

CGContextSetFillColorWithColor(context, strokeColor);
[text drawAtPoint:CGPointMake(0.0f, 0.0f) withFont:[UIFont fontWithName:@"Helvetica" size:fontSize]];
3 голосов
/ 12 июля 2009

Эй, я только что нашел примечание в своем коде.

Видимо CGContextShowTextAtPoint не работает с CGContextSetFont.
Вам нужно вместо этого использовать CGContextSelectFont. Очевидно, а?

В любом случае, я знаю, что это не так, но вы можете попробовать использовать CGContextShowTextAtPoint.

Вероятно, это не относится к отдельному ответу.

1 голос
/ 23 сентября 2011

использовать метод CGContextSetTextMatrix. «Проблема с ног на голову» из матрицы.

1 голос
/ 04 июня 2010

Существует еще одна возможность: указанная вами позиция текста лежит вне прямоугольника, в котором вы пытаетесь нарисовать. Это легко проверить, подставив

CGContextSetTextPosition( oContex, 100, 100 );

с

CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));
1 голос
/ 12 июля 2009

Эй, может быть проблема с кодировкой.

Попробуйте изменить kCGEncodingFontSpecific на kCGEncodingMacRoman.

Позже, когда все заработает, избавься от CGContextShowTextAtPoint.
Это мусор, не в юникоде, и для использования версий глифа вам нужно
Вызовите запрещенные API. Вам лучше использовать UIKit для рисования текста.
Он хорошо разбирается в Unicode, а также выполняет достойную замену глифов для символов
которые отсутствуют в вашем шрифте.

1 голос
/ 12 июля 2009

Другие люди ( здесь и здесь ) сделали некоторые аффинные преобразования и использовали метод CGContextShowTextAtPoint, чтобы заставить его работать:

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

Еще одна возможная проблема заключается в том, что метод CGContextSetRGBFillColor принимает аргументы с плавающей запятой в диапазоне от 0,0 до 1,0. Вы используете 255, чтобы указать «полный цвет», а это не то, что ожидает этот метод. Если вам удобнее работать с диапазоном от 0 до 255, должно работать следующее:

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