您的位置:首页 > 移动开发 > IOS开发

ios:CGContextRef 渲染中文问题

2014-04-27 23:35 309 查看
1.项目中遇到drawRect来渲染中文,但是调用CGContextShowTextAtPoint方法失败,于是查了些资料整理总结一下

2.既然apple能显示中文,那么自然也是支持中文的。

查看所有字体:

NSArray *fontFamilies = [UIFontfamilyNames];

for(NSString *fontFam in fontFamilies) {

NSLog(@"=========%@=========",fontFam);

NSArray *fontNames = [UIFontfontNamesForFamilyName:fontFam];

for (NSString* fontName in fontNames) {

NSLog(@"%@",fontName);

}
}


其中就有两个中文字体:

-----Heiti SC-----

STHeitiSC-Medium

STHeitiSC-Light

⋯⋯

-----Heiti TC------

STHeitiTC-Medium

STHeitiTC-Light

这是两个系统内置的字体族,一个简体黑体,一个是繁体黑体。这两个字体族都分别包含中、轻两种不通字重的字体。

这里感谢@容我博爱的博客,具体可以参照其一篇博客http://blog.sina.com.cn/s/blog_a6b43f6b0101lonr.html

3.字体找到了,然后用CTFontCreateWithName函数来加载,不过要添加CoreText.framework框架

代码如下

- (void)drawRect:(CGRect)rect
{
[super drawRect:rect];
NSString * sX = @"爱";
CGContextRef context = UIGraphicsGetCurrentContext();
// Prepare font
CGFloat s = 18;
CTFontRef ctfont = CTFontCreateWithName(CFSTR("STHeitiSC-Medium"), s, NULL);
CGColorRef ctColor = [[UIColor greenColor] CGColor];
// Create an attributed string
CFStringRef keys[] = { kCTFontAttributeName,kCTForegroundColorAttributeName };
CFTypeRef values[] = { ctfont,ctColor};
CFDictionaryRef attr = CFDictionaryCreate(NULL, (const void **)&keys, (const void **)&values,

sizeof(keys) / sizeof(keys[0]), &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);

CFStringRef ctStr = CFStringCreateWithCString(nil, [sX UTF8String], kCFStringEncodingUTF8);
CFAttributedStringRef attrString = CFAttributedStringCreate(NULL,ctStr, attr);
CTLineRef line = CTLineCreateWithAttributedString(attrString);
//    CGContextSetTextMatrix(context, CGAffineTransformIdentity);
//因为坐标系的不用,这里要翻转一下
CGContextSetTextMatrix (context, CGAffineTransformMake(1, 0, 0, -1, 0, 0));
//CGContextSetTextMatrix(context, CGAffineTransformMakeRotation(3.14));
//CGContextSetTextMatrix(context, CGAffineTransformMakeScale(1.0, -1.0)); //Use this one if the view's coordinates are flipped
CGContextSetTextPosition(context, s, s);
CTLineDraw(line, context);
CFRelease(line);
CFRelease(attrString);
CFRelease(ctStr);
// Clean up
CFRelease(attr);
CFRelease(ctfont);
}
4.结果如图



ps:这里涉及到ios应用程序字体定制化的东西,具体细节不是很了解,时间的关系,我对背后的东西没有深究,待有时间再去学习。上面的代码有参照@酒歌的博客,
如果有疑问,请移步http://blog.sina.com.cn/s/blog_4b657a0601014blv.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: