计算适合矩形的最大字体大小?

时间:2010-11-03 19:58:37

标签: ios iphone objective-c cocoa-touch

我正在尝试找到适合给定字符串的最大字体大小。该算法的目标是尽可能用尽可能大的字体填充尽可能多的矩形。我的方法 - 从我在网上找到的方法修改 - 做得很好,但它通常不会填满整个矩形。我很乐意看到如何改进这种算法的合作,以便每个人都可以从中受益:

-(float) maxFontSizeThatFitsForString:(NSString*)_string 
                               inRect:(CGRect)rect 
                             withFont:(NSString *)fontName 
                             onDevice:(int)device 
{   

    // this is the maximum size font that will fit on the device
    float _fontSize = maxFontSize;
    float widthTweak;

    // how much to change the font each iteration. smaller
    // numbers will come closer to an exact match at the 
    // expense of increasing the number of iterations.
    float fontDelta = 2.0;

    // sometimes sizeWithFont will break up a word 
    // if the tweak is not applied. also note that 
    // this should probably take into account the
    // font being used -- some fonts work better
    // than others using sizeWithFont.
    if(device == IPAD)
        widthTweak = 0.2;
    else
        widthTweak = 0.2;

    CGSize tallerSize = 
           CGSizeMake(rect.size.width-(rect.size.width*widthTweak), 100000);
    CGSize stringSize = 
           [_string sizeWithFont:[UIFont fontWithName:fontName size:_fontSize]
               constrainedToSize:tallerSize];

    while (stringSize.height >= rect.size.height)
    {       
        _fontSize -= fontDelta;
        stringSize = [_string sizeWithFont:[UIFont fontWithName:fontName 
                                          size:_fontSize] 
                             constrainedToSize:tallerSize];
    }

    return _fontSize;
}

3 个答案:

答案 0 :(得分:4)

使用以下方法计算适合给定rect和字符串的字体。

您可以将字体更改为您需要的字体。 此外,如果需要,您可以添加默认字体高度;

方法是自我解释的。

-(UIFont*) getFontTofitInRect:(CGRect) rect forText:(NSString*) text {
       CGFloat baseFont=0;
        UIFont *myFont=[UIFont systemFontOfSize:baseFont];
        CGSize fSize=[text sizeWithFont:myFont];
        CGFloat step=0.1f;

        BOOL stop=NO;
        CGFloat previousH;
        while (!stop) {
            myFont=[UIFont systemFontOfSize:baseFont+step ];
            fSize=[text sizeWithFont:myFont constrainedToSize:rect.size lineBreakMode:UILineBreakModeWordWrap];

            if(fSize.height+myFont.lineHeight>rect.size.height){           
                myFont=[UIFont systemFontOfSize:previousH];
                fSize=CGSizeMake(fSize.width, previousH);
                stop=YES;
            }else {
                 previousH=baseFont+step;
            }

            step++;
    }
    return myFont;

 }

答案 1 :(得分:0)

没有必要浪费时间做循环。首先,在最大和最小字体点设置下测量文本宽度和高度。根据更严格的限制,宽度或高度,使用以下数学:

如果宽度更具限制性(即maxPointWidth / rectWidth > maxPointHeight / rectHeight),请使用:

pointSize = minPointSize + rectWidth * [(maxPointSize - minPointSize) / (maxPointWidth - minPointWidth)]

否则,如果高度限制更严格,请使用:

pointSize = minPointSize + rectHeight * [(maxPointSize - minPointSize) / (maxPointHeight - minPointHeight)]

答案 2 :(得分:0)

完全填充矩形可能是不可能的。

以某种字体大小说你有两行文字,都是水平填充屏幕,但垂直方向你几乎但不是三行空格。

如果你只增加一点点字体大小,那么这些线就不再适合了,所以你需要三条线,但三条线不能垂直放置。

所以你别无选择,只能忍受垂直差距。