在使用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();
有什么办法可以让文本内容铺满整个画布、或退而求其次让中英文形成一样的布局
下面是两张绘制的图片:
解决方案
40
字体基线的问题,郁闷的是中文字体没有基线的概念,只有西文字体有,中文字体是靠上下边界来调整字体位置的,既ascent和descent
http://blog.csdn.net/qqaniu/article/details/16364501
这篇文章有教你怎么调整中文字体的上下边界
另外一种比较暴力的解决办法就是直接调整内容的区域
例如
button.contentEdgeInsets = UIEdgeInsetsMake(2f, 0.0f, -2f, 0.0f);
http://blog.csdn.net/qqaniu/article/details/16364501
这篇文章有教你怎么调整中文字体的上下边界
另外一种比较暴力的解决办法就是直接调整内容的区域
例如
button.contentEdgeInsets = UIEdgeInsetsMake(2f, 0.0f, -2f, 0.0f);