Iphone 如何在iOS中绘制LaTeX字体(cmr10.ttf)的特殊字符? 总结
我正在为iPhone开发一个计算器应用程序,希望在UIView中绘制与LaTeX外观相同的数学表达式。Iphone 如何在iOS中绘制LaTeX字体(cmr10.ttf)的特殊字符? 总结,iphone,ios,nsstring,latex,special-characters,Iphone,Ios,Nsstring,Latex,Special Characters,我正在为iPhone开发一个计算器应用程序,希望在UIView中绘制与LaTeX外观相同的数学表达式。 所以我使用cmr10.ttf(LaTeX默认值)作为绘图字体,但一些字符没有显示 测试代码和详细信息 以下是我的测试代码: - (void)drawRect:(CGRect)rect { [super drawRect:rect]; const int len = 4; Byte cstr[len]; cstr[0] = 0x30; // 0 cstr
所以我使用cmr10.ttf(LaTeX默认值)作为绘图字体,但一些字符没有显示 测试代码和详细信息 以下是我的测试代码:
- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
const int len = 4;
Byte cstr[len];
cstr[0] = 0x30; // 0
cstr[1] = 0x00; // Capital Gamma
cstr[2] = 0x41; // A
cstr[3] = 0x61; // a
NSString *str = [[NSString alloc] initWithBytes:(const void*)cstr length:len encoding:NSASCIIStringEncoding];
[str drawAtPoint:CGPointMake(10, 0) withFont:[UIFont fontWithName:@"cmr10" size:40]];
}
我本来希望在UIView上显示“0ΓAa”,但实际上显示了“0Aa”,没有大写字母
根据CMR10代码表(见下文),0x00表示资本伽马。但在ASCII表中,0x00表示NUL控制字符。这可能就是为什么没有显示大写伽马字符
这是CMR10的代码表。一般字符(如字母表)与ASCII表的代码相同,但其他字符则不同
(摘自第18页,共页)
问题:
所以我想知道的是如何画一个字符,这个字符代码和ASCII中的控制字符相同
补充资料
- 我在BaKoMa字体包中使用了cmr10.ttf
- 我正在Xcode 4.6.1和iOS5或更高版本的设备上开发这个计算器应用程序
CGContextShowGlyphsAtPoint
和CGFontGetGlyphWithGlyphName
绘制具有控制字符代码的字符的方法
例如:
CGContextRef context = UIGraphicsGetCurrentContext();
if (context) {
CGFontRef font = CGFontCreateWithFontName(CFSTR("cmr10"));
CGContextSetFont(context, font);
CGContextSetFontSize(context, 40);
CGAffineTransform transform = CGAffineTransformMake(1.0, 0.0, 0.0, -1.0, 0.0, 0.0);
CGContextSetTextMatrix(context, transform);
const int len = 4;
CGGlyph glyphs[len];
glyphs[0] = CGFontGetGlyphWithGlyphName(font, CFSTR("Gamma"));
glyphs[1] = CGFontGetGlyphWithGlyphName(font, CFSTR("Upsilon"));
glyphs[2] = CGFontGetGlyphWithGlyphName(font, CFSTR("Theta"));
glyphs[3] = CGFontGetGlyphWithGlyphName(font, CFSTR("fl"));
CGContextShowGlyphsAtPoint(context, 0, 50, glyphs, len);
CGFontRelease(font);
}
CGFontGetGlyphWithGlyphName
的第二个参数中的“Gamma”是称为“post”的字形名称(请参阅)。它在cmr10.ttf文件中定义
我使用TTFEdit查找字形名称
drawAtPoint:
应该透明地处理所有编码内容,所以我希望
以下几点需要注意:
NSString *str = @"0ΓAa";
[str drawAtPoint:CGPointMake(10, 0) withFont:[UIFont fontWithName:@"cmr10" size:40]];
更新:我现在已经下载了字体并测试了代码。它确实有效
更新2:它不起作用,谢谢你的回答和测试:)我试过那个代码,但大写伽马是用另一种字体(不是cmr10)绘制的。“0”、“A”和“A”是用cmr10正确绘制的。@DaikiKomatsuda:你是对的,我没有注意到区别。我会看看我是否能在以后找到答案,否则你就有了有效的解决方案。@Daikikikomatsuda:我已经在我的答案中添加了一些信息。它没有解决问题,但解释了为什么通常的方法不起作用(TrueType字体中的cmap编码错误)。您的新方法非常简单。我认为这对于一些特殊的角色来说也是更好的。对于许多类型的字符,我的解决方案可能很容易阅读。谢谢