Iphone CGContextShowTextAtPoint для японских символов - PullRequest
8 голосов
/ 06 августа 2009

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

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

Ответы [ 4 ]

5 голосов
/ 06 августа 2009

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

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

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

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

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

Проверьте [NSString drawAtPoint:...], чтобы начать.

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

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

3 голосов
/ 29 сентября 2010

Мне удалось добиться этого с помощью повторной реализации CGFontGetGlyphsForUnichars от Jens Egeblad: 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]);
1 голос
/ 20 декабря 2009

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

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

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

0 голосов
/ 22 августа 2012

Это, возможно, поможет вам% theme starter%. Спасибо Ритмику Фистману за отличный совет!

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