Iphone CGContextShowTextAtPoint用于日文字符

时间:2009-08-06 08:18:21

标签: iphone unicode cjk cgcontext

我正在开发一个应用,我正在使用CGContextShowTextAtPoint向屏幕显示文字。我还要显示日文字符,但CGContextShowTextAtPoint将C字符串作为输入。所以要么A)如何将日文字符更改为C字符串?如果无法做到这一点,B)如何在屏幕上手动打印日文字符(在drawRect方法中)。

提前致谢。

4 个答案:

答案 0 :(得分:5)

CoreText可以帮助您:

  1. CTFontGetGlyphsForCharacters(iOS 3.2起)将Unicode字符映射到字形
  2. CTFontDrawGlyphs(iOS 4.2以上)将字形绘制为CGContext。
  3. NB。 CGContextShowGlyphs应该有效,但我从来没有找到将我的UniChars转换为字形的方法。有关here的更多信息:

    古代,iOS 3.2之前的回答

    你需要使用UIKit。

    查看[NSString drawAtPoint:...]即可开始使用。

    SO question也很有用。

    我不知道他们用CoreGraphic文字的东西在想什么,这没什么用。

答案 1 :(得分:3)

通过使用Jens Egeblad重新实现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]);

答案 2 :(得分:1)

为了它的价值,我花了很长时间试图让日文字符在CoreGraphics中很好地工作,并且不喜欢它离开我的地方。

最后我转而使用UILabels来处理文本。我需要的所有CoreGraphics类似的东西都可以使用transform&amp; amp;动画支持,最终得到的代码更简单。

这可能不适合您的情况,但值得考虑。

答案 3 :(得分:0)

这可能会帮助您完成主题启动%。感谢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);