如何在iOS中渲染拉伸文本?
给定一个矩形区域,我想使用特定的字体渲染一些文本,并使渲染的文本填充矩形 。 如下图所示:
- 这不只是改变字体大小
- 将其渲染为位图,然后缩放它不是一个选项(它看起来很可怕)
- 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
。