7

标题几乎解释了它。我有一张正在画文字的图像。我希望根据图像的大小调整文本的大小,并想找到一种方法来获得比图像本身短一点的字体高度。

4

3 回答 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

从这里

http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/CoreText_Programming/Operations/Operations.html

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 回答