我正在寻找一种找到正确字体大小的方法,以便以正确的宽度在地图上绘制文本(随着用户放大和缩小地图而改变)。我曾经使用以下代码:
+(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倍的平局。
答案 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;
}