8

我正在开发一个CGContextShowTextAtPoint用于在屏幕上显示文本的应用程序。我还想显示日文字符,但CGContextShowTextAtPoint将 C 字符串作为输入。所以要么 A)如何将日文字符更改为 C 字符串?如果这是不可能的,B)如何手动将日文字符打印到屏幕上(在 drawRect 方法中)。

提前致谢。

4

4 回答 4

5

CoreText 可以帮助您:

  1. CTFontGetGlyphsForCharacters(iOS 3.2 以上)将 Unicode 字符映射到字形
  2. CTFontDrawGlyphs(iOS 4.2 及更高版本)将字形绘制到 CGContext 中。

注意。CGContextShowGlyphs应该可以,但我从来没有找到将我的 UniChars 转换为字形的方法。更多关于这里

古老的,iOS 3.2 之前的答案

您需要为此使用 UIKit。

查看[NSString drawAtPoint:...]开始。

这个SO question也很有用。

我不知道他们对 CoreGraphic 文本的想法是什么,它没用。

于 2009-08-06T08:33:47.660 回答
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]);
于 2010-09-29T12:34:58.853 回答
1

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

最后我切换到使用 UILabels 来处理文本。我需要的所有类似 CoreGraphics 的东西都可以使用变换和动画支持来复制,最终生成的代码要简单得多。

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

于 2009-12-20T12:55:26.293 回答
0

这可能会帮助您%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);
于 2012-08-22T09:47:16.310 回答