我正在开发一个应用,我正在使用CGContextShowTextAtPoint
向屏幕显示文字。我还要显示日文字符,但CGContextShowTextAtPoint
将C字符串作为输入。所以要么A)如何将日文字符更改为C字符串?如果无法做到这一点,B)如何在屏幕上手动打印日文字符(在drawRect方法中)。
提前致谢。
答案 0 :(得分:5)
CoreText可以帮助您:
CTFontGetGlyphsForCharacters
(iOS 3.2起)将Unicode字符映射到字形CTFontDrawGlyphs
(iOS 4.2以上)将字形绘制为CGContext。 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);