Вопрос

Я работаю над приложением, в котором использую CGContextShowTextAtPoint для вывода текста на экран.Я хочу также отображать японские символы, но CGContextShowTextAtPoint принимает в качестве входных данных строку C.Итак, либо А) Как изменить японские символы на строку C?Если это невозможно, Б) Как вручную вывести японские символы на экран (в рамках метода drawRect).

Заранее спасибо.

Это было полезно?

Решение

CoreText может помочь вам:

  1. CTFontGetGlyphsForCharacters (iOS 3.2 и более поздние версии) сопоставляет символы Юникода с глифами.
  2. CTFontDrawGlyphs (iOS 4.2 и более поздние версии) рисует глифы в CGContext.

Примечание. CGContextShowGlyphs должно работать, но я так и не нашел способа преобразовать UniChars в глифы.Подробнее об этом здесь:

Древний ответ до iOS 3.2

для этого вам нужно использовать UIKit.

Проверить [NSString drawAtPoint:...] для начала.

Этот ТАК вопрос тоже полезно.

Я не знаю, что они думали о текстовом материале CoreGraphic, это бесполезно.

Другие советы

Мне удалось заставить это работать, используя перереализацию CGFontGetGlyphsForUnichars Йенса Эгеблада: GlyphDrawing.mm

Сначала загрузите японский шрифт в виде otf-файла из пакета приложения:

// Load font file from otf file
NSString *fontPath = [[NSBundle mainBundle] pathForResource:@"HStdNW8" ofType:@"otf"];
CGDataProviderRef fontDataProvider = CGDataProviderCreateWithFilename([fontPath UTF8String]);
CGFontRef _cgFont = CGFontCreateWithDataProvider(fontDataProvider);
CGDataProviderRelease(fontDataProvider);

Затем вы можете преобразовать текст Unichar в глифы и нарисовать их:

NSString *text = @"日本語"
CGContextSetFont(context, _cgFont);
CGContextSetFontSize(context, 12);
CGGlyph textGlyphs[[text length]];

unichar textChars[[text length]];
for(int i = 0; i < [text length]; i++) {
    textChars[i] = [text characterAtIndex:i];
}
CMFontGetGlyphsForUnichars(_cgFont, textChars, textGlyphs, [text length]);
CGContextShowGlyphsAtPoint(context, xCoord, yCoord, textGlyphs, [text length]);

Как бы то ни было, я потратил много времени, пытаясь заставить японские символы хорошо работать в CoreGraphics, и мне не понравилось, к чему это меня привело.

В конце концов я переключился на использование UILabels для обработки текста.Все необходимые мне вещи, подобные CoreGraphics, можно было воспроизвести с помощью поддержки преобразований и анимации, и в конечном итоге полученный код оказался намного проще.

Возможно, это не подходит для вашей ситуации, но об этом стоит подумать.

Возможно, это поможет вам %topic starter%.Спасибо Rhythmic Fistman за отличный совет!

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSelectFont (context, [self.font.fontName cStringUsingEncoding:NSASCIIStringEncoding], self.font.pointSize, kCGEncodingMacRoman);
    CGContextSetCharacterSpacing(context, characterSpacing);
    CGContextSetFillColorWithColor(context, [self.textColor CGColor]);
    CGAffineTransform myTextTransform = CGAffineTransformScale(CGAffineTransformIdentity, 1.f, -1.f );
    CGContextSetTextMatrix (context, myTextTransform);

    CGGlyph glyphs[self.text.length];
    CTFontRef fontRef = CTFontCreateWithName((CFStringRef)self.font.fontName, self.font.pointSize, NULL);
    CTFontGetGlyphsForCharacters(fontRef, (const unichar*)[self.text cStringUsingEncoding:NSUnicodeStringEncoding], glyphs, self.text.length);
    float centeredY = (self.font.pointSize + (self.frame.size.height- self.font.pointSize)/2)-2;
    CGContextShowGlyphsAtPoint(context, rect.origin.x, centeredY, (const CGGlyph *)glyphs, self.text.length);
    CFRelease(fontRef);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top