我正在开发一个CGContextShowTextAtPoint
用于在屏幕上显示文本的应用程序。我还想显示日文字符,但CGContextShowTextAtPoint
将 C 字符串作为输入。所以要么 A)如何将日文字符更改为 C 字符串?如果这是不可能的,B)如何手动将日文字符打印到屏幕上(在 drawRect 方法中)。
提前致谢。
CoreText 可以帮助您:
CTFontGetGlyphsForCharacters
(iOS 3.2 以上)将 Unicode 字符映射到字形CTFontDrawGlyphs
(iOS 4.2 及更高版本)将字形绘制到 CGContext 中。注意。CGContextShowGlyphs
应该可以,但我从来没有找到将我的 UniChars 转换为字形的方法。更多关于这里:
古老的,iOS 3.2 之前的答案
您需要为此使用 UIKit。
查看[NSString drawAtPoint:...]
开始。
这个SO question也很有用。
我不知道他们对 CoreGraphic 文本的想法是什么,它没用。
我能够通过使用 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]);
对于它的价值,我花了很长时间试图让日文字符在 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);