求指导iOS 绘制文本字号与文本行高的关系

iOS 码拜 8年前 (2016-03-21) 1144次浏览
在使用CoreText框架绘制NSAttributedString时,给文本内容设置64号字体如下:

CGFloat fontSize=64;
    NSMutableAttributedString * tempString=[[NSMutableAttributedString alloc] initWithString:@"test"];
    [tempString addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:fontSize] range:NSMakeRange(0, tempString.length)];
    CGSize size= [tempString size];
    NSLog(@"height:%f;height/fontSize:%f",size.height,size.height/fontSize);

打印结果:
2016-06-04 10:38:00.982 LedArt[1156:51382] height:76.375000;height/fontSize:1.193359
也就是说,假如本人想得到64高度的图片,那么本人得将字号重新计算:fontSize/1.2,但是这样得到的图片文本内容并没有铺满整个画布,而且中英文所得到的图片不一样,纯中文得到的图片顶部对齐,英文是居中对齐,绘制代码如下:

//设置画布透明,1倍缩放
    UIGraphicsBeginImageContextWithOptions(CGSizeMake(width, height), NO, 1);
    //获取bitmap上下文
    CGContextRef context = UIGraphicsGetCurrentContext();
    //旋转一下方向,否则绘制出来的图片是上下颠倒的
    CGContextConcatCTM(context, CGAffineTransformScale(CGAffineTransformMakeTranslation(0, height), 1.0, -1.0));
    //文本绘制区域
    CGRect textRect = CGRectMake(0, 0, width, height);
    //设置画布颜色
    if(backgroundColor!=nil)
    {
        CGContextSetFillColorWithColor(context, [backgroundColor CGColor]);
        CGContextFillRect(context, textRect);
    }
    //自定义绘制NSAttributedString
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((__bridge CFAttributedStringRef)attributedString);
    //添加文本绘制路径
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathAddRect(path, NULL, textRect);
    CTFrameRef frame = CTFramesetterCreateFrame(framesetter, CFRangeMake(0, 0), path, NULL);
    //释放使用的资源
    CFRelease(path);
    CFRelease(framesetter);
    //绘制文本内容
    CTFrameDraw(frame, context);
    CFRelease(frame);
    //获取生成的图片
    UIImage *image=UIGraphicsGetImageFromCurrentImageContext();

有什么办法可以让文本内容铺满整个画布、或退而求其次让中英文形成一样的布局
下面是两张绘制的图片:
求指导iOS 绘制文本字号与文本行高的关系
求指导iOS 绘制文本字号与文本行高的关系

解决方案

40

字体基线的问题,郁闷的是中文字体没有基线的概念,只有西文字体有,中文字体是靠上下边界来调整字体位置的,既ascent和descent
http://blog.csdn.net/qqaniu/article/details/16364501
这篇文章有教你怎么调整中文字体的上下边界
另外一种比较暴力的解决办法就是直接调整内容的区域
例如
button.contentEdgeInsets = UIEdgeInsetsMake(2f, 0.0f, -2f, 0.0f);

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明求指导iOS 绘制文本字号与文本行高的关系
喜欢 (0)
[1034331897@qq.com]
分享 (0)