标题几乎解释了它。我有一张正在画文字的图像。我希望根据图像的大小调整文本的大小,并想找到一种方法来获得比图像本身短一点的字体高度。
问问题
11125 次
3 回答
20
好的,所以对于那些认为迭代是不可避免的人来说:
NSString *string = @"The string to render";
CGRect rect = imageView.frame;
UIFont *font = [UIFont fontWithSize:12.0]; // find the height of a 12.0pt font
CGSize size = [string sizeWithFont:font];
float pointsPerPixel = 12.0 / size.height; // compute the ratio
// Alternatively:
// float pixelsPerPoint = size.height / 12.0;
float desiredFontSize = rect.size.height * pointsPerPixel;
// Alternatively:
// float desiredFontSize = rect.size.height / pixelsPerPoint;
desiredFontSize
将包含以点为单位的字体大小,其高度与指定矩形的高度完全相同。您可能希望将其乘以 0.8,以使字体比矩形的实际大小小一点,使其看起来不错。
于 2012-05-03T04:02:08.453 回答
1
从这里
CGFloat GetLineHeightForFont(CTFontRef iFont)
{
CGFloat lineHeight = 0.0;
check(iFont != NULL);
// Get the ascent from the font, already scaled for the font's size
lineHeight += CTFontGetAscent(iFont);
// Get the descent from the font, already scaled for the font's size
lineHeight += CTFontGetDescent(iFont);
// Get the leading from the font, already scaled for the font's size
lineHeight += CTFontGetLeading(iFont);
return lineHeight;
}
要使用它,请猜测点的大小,找到它的行高(您可能关心也可能不关心领先)。然后使用答案与您必须缩放点大小的高度之间的比率。我认为您不能保证高度完全正确——如果您关心它是否准确,您必须迭代直到它足够接近(使用新尺寸作为新猜测)。
于 2012-05-02T18:34:29.290 回答
0
注意:这假设您的字体大小将始终小于 CGRect 的磅值。根据需要调整方法以纠正该假设。
试试这个。适用于创建字体的 3 种主要方法中的任何一种。应该是不言自明的,但增量是您希望在检查之间减少的数量。如果您不关心确切的大小,请将该数字设置得更大以获得更快的速度。如果您确实关心,请使其更小以获得更高的准确性。
- (UIFont *)systemFontForRectHeight:(CGFloat)height
increment:(CGFloat)increment {
UIFont *retVal = nil;
for (float i = height; i > 0; i = i - increment) {
retVal = [UIFont systemFontOfSize:i];
if ([retVal lineHeight] < height) break;
}
return retVal;
}
- (UIFont *)boldSystemFontForRectHeight:(CGFloat)height
increment:(CGFloat)increment {
UIFont *retVal = nil;
for (float i = height; i > 0; i = i - increment) {
retVal = [UIFont boldSystemFontOfSize:i];
if ([retVal lineHeight] < height) break;
}
return retVal;
}
- (UIFont *)fontNamed:(NSString *)name
forRectHeight:(CGFloat)height
increment:(CGFloat)increment {
UIFont *retVal = nil;
for (float i = height; i > 0; i = i - increment) {
retVal = [UIFont fontWithName:name size:i];
if ([retVal lineHeight] < height) break;
}
return retVal;
}
于 2012-05-02T19:01:08.560 回答