• 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
  • 相关阅读:
    四层、七层负载均衡的区别
    confd+etcd实现高可用自动发现
    从零开始搭建etcd分布式存储系统+web管理界面
    从零开始搭建Prometheus自动监控报警系统
    tcpdump工具使用说明
    Nginx的负载均衡
    Nginx的正向代理与反向代理详解
    linux集群自动化搭建(生成密钥对+分发公钥+远程批量执行脚本)
    linux文件权限总结(创建root不可以删除文件、只可追加的日志文件等)
    前端技巧备忘
  • 原文地址:https://www.cnblogs.com/yoon/p/3695466.html
Copyright © 2020-2023  润新知