如何在iOS中渲染拉伸文本?

给定一个矩形区域,我想使用特定的字体渲染一些文本,并使渲染的文本填充矩形 。 如下图所示:

在这里输入图像说明

  1. 这不只是改变字体大小
  2. 将其渲染为位图,然后缩放它不是一个选项(它看起来很可怕)
  3. vectorgraphics是做到这一点的方法

我想出了以下这似乎为我的目的工作。 代码绘制一行文本缩放来填充边界。 子类UIView并replacedrawRect ,如下所示。

 - (void)drawRect:(CGRect)rect { [self drawScaledString:@"Abcde"]; } - (void)drawScaledString:(NSString *)string { CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSetTextMatrix(context, CGAffineTransformIdentity); NSAttributedString *attrString = [self generateAttributedString:string]; CFAttributedStringSetAttribute((CFMutableAttributedStringRef)attrString, CFRangeMake(0, string.length), kCTForegroundColorAttributeName, [UIColor redColor].CGColor); CTLineRef line = CTLineCreateWithAttributedString((CFAttributedStringRef) attrString); // CTLineGetTypographicBounds doesn't give correct values, // using GetImageBounds instead CGRect imageBounds = CTLineGetImageBounds(line, context); CGFloat width = imageBounds.size.width; CGFloat height = imageBounds.size.height; CGFloat padding = 0; width += padding; height += padding; float sx = self.bounds.size.width / width; float sy = self.bounds.size.height / height; CGContextSetTextMatrix(context, CGAffineTransformIdentity); CGContextTranslateCTM(context, 1, self.bounds.size.height); CGContextScaleCTM(context, 1, -1); CGContextScaleCTM(context, sx, sy); CGContextSetTextPosition(context, -imageBounds.origin.x + padding/2, -imageBounds.origin.y + padding/2); CTLineDraw(line, context); CFRelease(line); } - (NSAttributedString *)generateAttributedString:(NSString *)string { CTFontRef helv = CTFontCreateWithName(CFSTR("Helvetica-Bold"),20, NULL); CGColorRef color = [UIColor blackColor].CGColor; NSDictionary *attributesDict = [NSDictionary dictionaryWithObjectsAndKeys: (id)helv, (NSString *)kCTFontAttributeName, color, (NSString *)kCTForegroundColorAttributeName, nil]; NSAttributedString *attrString = [[[NSMutableAttributedString alloc] initWithString:string attributes:attributesDict] autorelease]; return attrString; } 

用法示例:

 CGRect rect = CGRectMake(0, 0, 50, 280); MyCTLabel *label = [[MyCTLabel alloc] initWithFrame:rect]; label.backgroundColor = [UIColor whiteColor]; [self addSubview:label]; 

你可以尝试CoreText。 获取一个CTFramesetter ,计算它的矩形,然后计算将该矩形压缩到所需边界所需的仿射变换,并将其设置为CTM。 那么当你画出文字的时候,应该以完整的质量适当地拉伸它。

您可以设置UILabel转换属性并缩放宽度:

 [myLabel sizeToFit]; myLabel.transform = CGAffineTransformMakeScale(0.5, 1.0); 

你也可以尝试用UILabel的@property(nonatomic) BOOL adjustsFontSizeToFitWidth@property minimumFontSize

最初,您可以为font属性设置更高的值,并使用最小字体值初始化minimumFontSize