2010-11-03 2 views
7

Я пытаюсь найти максимальный размер шрифта, который будет вписываться в данный прямоугольник для данной строки. Цель алгоритма состоит в том, чтобы заполнить как можно больше прямоугольника как можно большим шрифтом. Мой подход, который изменяется от одного, который я нашел в Интернете, выполняет справедливую работу, но часто не заполняет весь прямоугольник. Я хотел бы видеть некоторое сотрудничество о том, как улучшить этот алгоритм так, чтобы каждый мог извлечь из этого пользу:Рассчитать максимальный размер шрифта, который подходит в прямоугольнике?

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

Когда вы говорите «заполните весь прямоугольник», вы имеете в виду только по горизонтали? – Magnus

ответ

4

Используйте следующий метод для расчета шрифт, который может поместиться, для данного прямоугольника и строки.

Вы можете изменить шрифт на тот, который вам нужен. Кроме того, при необходимости вы можете добавить высоту шрифта по умолчанию;

Метод объяснения.

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

} 
0

Не нужно терять время, выполняя петли. Во-первых, измерьте ширину и высоту текста при настройках макс и мин. В зависимости от того, какая более ограничительный характер, ширина или высота, используйте следующую математику:

Если ширина более ограничительным (т.е. maxPointWidth/rectWidth > maxPointHeight/rectHeight) используют:

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

Else, если высота более ограничительное применение:

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

Возможно полностью заполнить прямоугольник.

Говорите при определенном размере шрифта, у вас есть две строки текста, которые заполняют экран горизонтально, но вертикально у вас есть почти, но не совсем три строки.

Если вы увеличиваете размер шрифта чуть-чуть, то строки больше не подходят, поэтому вам нужны три строки, но три строки не подходят по вертикали.

Таким образом, у вас нет выбора, кроме как жить с вертикальным зазором.

Смежные вопросы