菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
279
0

ios:CGContextRef 渲染中文问题

原创
05/13 14:22
阅读数 631246

标签:com   http   class   blog   style   div   code   img   java   size   javascript   

1.项目中遇到drawRect来渲染中文,但是调用CGContextShowTextAtPoint方法失败,于是查了些资料整理总结一下

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

查看所有字体:

bubuko.com,布布扣
NSArray *fontFamilies = [UIFontfamilyNames];

for(NSString *fontFam in fontFamilies) {

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

NSArray *fontNames = [UIFontfontNamesForFamilyName:fontFam];

for (NSString* fontName in fontNames) {

NSLog(@"%@",fontName);

}
}
bubuko.com,布布扣

其中就有两个中文字体:

-----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框架

代码如下

bubuko.com,布布扣
- (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.结果如图
bubuko.com,布布扣

ps:这里涉及到ios应用程序字体定制化的东西,具体细节不是很了解,时间的关系,我对背后的东西没有深究,待有时间再去学习。上面的代码有参照@酒歌的博客,
如果有疑问,请移步http://blog.sina.com.cn/s/blog_4b657a0601014blv.html
bubuko.com,布布扣

 

ios:CGContextRef 渲染中文问题,布布扣,bubuko.com

ios:CGContextRef 渲染中文问题

发表评论

0/200
279 点赞
0 评论
收藏
为你推荐 换一批