айфон:как нарисовать текст в окне?
Вопрос
Странная ситуация - примеры из 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" );
}
Решение
Я без проблем использовал следующий код для рисования текста непосредственно в контексте 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]];
Другие советы
Эй, я только что нашел заметку в своем коде.
Видимо CGContextShowTextAtPoint
не работает с CGContextSetFont
.
Вместо этого вам нужно использовать CGContextSelectFont
.Очевидно, да?
В любом случае, я знаю, что это не так, но вы можете попробовать использовать CGContextShowTextAtPoint
.
Это, вероятно, не входило в отдельный ответ.
Другие люди (здесь и здесь) выполнили некоторые аффинные преобразования и использовали 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);
Привет, может быть проблема с кодировкой.
Попробуйте изменить kCGEncodingFontSpecific
к kCGEncodingMacRoman
.
Позже, когда все заработает, избавьтесь от CGContextShowTextAtPoint
.
Это мусор, он не поддерживает Юникод, и для использования версий глифов вам понадобится
вызывать запрещенные API.Вам лучше использовать UIKit для рисования текста.
Он разбирается в Юникоде, а также выполняет достойную замену глифов для символов.
которых нет в вашем шрифте.
Существует еще одна возможность: указанная вами позиция текста находится за пределами прямоугольника, в котором вы пытаетесь нарисовать.Это легко проверить, подставив
CGContextSetTextPosition( oContex, 100, 100 );
с
CGContextSetTextPosition( oContex, CGRectGetMidX(i_poRect), CGRectGetMidY(i_poRect));
используйте метод CGContextSetTextMatrix.«Перевернутая проблема» — из матрицы.