iOS以给定宽度绘制文本

时间:2014-03-03 15:28:18

标签: ios text draw

我正在寻找一种找到正确字体大小的方法,以便以正确的宽度在地图上绘制文本(随着用户放大和缩小地图而改变)。我曾经使用以下代码:

+(float) calulateHeightFromMaxWidth:(NSString*)text withMaxWidth:(float)maxWidth withMaxFontSize:(float)maxFontSize{
 CGFloat fontSize;

 [text sizeWithFont:[UIFont systemFontOfSize:maxFontSize]  minFontSize:1 actualFontSize:&fontSize forWidth:maxWidth lineBreakMode:NSLineBreakByTruncatingTail];

return fontSize;

}

此方法始终返回正确的答案,但是在iOS 7中描述了sizeWithFont,我找不到在给定宽度后返回字体大小的替换。我在这个网站上发现了很多帖子,在你指定了一个大小后会给你宽度,但我找不到相反的(sizeWithAttributes :)。我试图避免一个解决方案,涉及循环不同的字体大小,直到我找到一个适合,因为这种方法可以被称为100可能1000倍的平局。

1 个答案:

答案 0 :(得分:0)

查看[NSString boundingRectWithSize:options:attributes:context:]您可以为参数大小的高度和宽度传递MAXFLOAT以获取文本的实际大小。

编辑:这里有一些使用非弃用方法相当有效地计算理想字体大小的代码:

+(float) calulateHeightFromMaxWidth:(NSString*)text withMaxWidth:(float)maxWidth withMaxFontSize:(float)maxFontSize{

    // The less exact you try to match the width, the fewer times the method will need to be called
    CGFloat textWidthMatchDelta = 10;
    CGFloat fontSize = maxFontSize;
    CGFloat minFontSize = 0;
    // If drawing a single line of text, omit `|NSStringDrawingUsesLineFragmentOrigin`.
    NSUInteger textOptions = NSStringDrawingTruncatesLastVisibleLine|NSStringDrawingUsesLineFragmentOrigin;

    while (YES) {
        CGRect textRect = [text boundingRectWithSize:CGSizeMake(maxWidth, MAXFLOAT)
                                             options:textOptions
                                          attributes:@{NSFontAttributeName : [UIFont systemFontOfSize:fontSize]
                                             context:nil];
        CGFloat textWidth = CGRectGetWidth(textRect);

        if (textWidth > maxWidth) {
            maxFontSize = fontSize;
            fontSize /= 2.0f;
        } else if (textWidth + textWidthMatchDelta < maxWidth) {
            minFontSize = fontSize;
            fontSize = minFontSize + (maxFontSize - minFontSize) / 2.0f;
        } else {
            break;
        }
    }

    return fontSize;
}