ios:CGContextRef 渲染中文问题
时间:2014-04-28 13:52:50
收藏:0
阅读:550
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
评论(0)