首页 > 代码库 > ios:CGContextRef 渲染中文问题

ios:CGContextRef 渲染中文问题

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