【问题标题】:iOS drawing text in a given widthiOS以给定宽度绘制文本
【发布时间】:2014-03-03 15:28:17
【问题描述】:

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

+(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 次平局。

【问题讨论】:

标签: ios text draw


【解决方案1】:

看看[NSString boundingRectWithSize:options:attributes:context:]你可以通过MAXFLOAT参数size的height和width得到文字的实际大小。

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

+(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;
}

【讨论】:

  • 谢谢,效果很好。我只需要按照您的建议删除“NSStringDrawingUsesLineFragmentOrigin”,因为我只画单线。
猜你喜欢
  • 1970-01-01
  • 2019-02-12
  • 2017-09-06
  • 2011-03-22
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
相关资源
最近更新 更多