zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    LINUX监控一:监控命令
    Kettle并行
    KETTLE集群搭建
    Solr报错Index locked for write for core '***'. Solr now longer supports forceful unlocking via 'unlockOnStartup'
    Solr json,xml等文件数据导入(添加索引)linux下操作
    python对solr进行查询、插入操作(GETPOST)
    Solr-5.3.1 dataimport 导入mysql数据
    解决MySQL数据导入报错Got a packet bigger than‘max_allowed_packet’bytes
    解决防火墙限制远程连接MySQL(导致错误10060可能之一)
    gensim加载word2vec训练结果(bin文件)并进行相似度实验
  • 原文地址:https://www.cnblogs.com/yoon/p/3695466.html
Copyright © 2011-2022 走看看