2010-11-03 29 views
7

Tôi đang cố gắng tìm kích thước phông chữ tối đa sẽ vừa với một đường thẳng nhất định cho một chuỗi nhất định. Mục đích của thuật toán là lấp đầy càng nhiều phần càng tốt càng tốt với phông chữ càng lớn càng tốt. Cách tiếp cận của tôi - được sửa đổi từ cách tôi tìm thấy trực tuyến - thực hiện một công việc công bằng, nhưng nó thường không điền vào toàn bộ phần trực tiếp. Tôi rất muốn nhìn thấy một số hợp tác về cách cải thiện thuật toán này để mọi người có thể được hưởng lợi từ nó:Tính toán kích thước phông chữ tối đa phù hợp trong trực tràng?

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

Khi bạn nói "lấp đầy toàn bộ trực tuyến", bạn chỉ có nghĩa là trên ngang? – Magnus

Trả lời

4

Sử dụng các phương pháp sau đây để tính toán font mà có thể phù hợp, đối với một rect nhất định và chuỗi.

Bạn có thể thay đổi phông chữ thành phông chữ bạn yêu cầu. Ngoài ra, nếu được yêu cầu, bạn có thể thêm chiều cao phông chữ mặc định;

Phương pháp tự giải thích.

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

Không cần lãng phí thời gian làm vòng lặp. Đầu tiên, đo chiều rộng và chiều cao của văn bản ở cài đặt điểm phông chữ tối đa và tối thiểu. Tùy thuộc vào bất cứ là hạn chế hơn, chiều rộng hoặc chiều cao, sử dụng toán học sau:

Nếu chiều rộng là hạn chế hơn (ví dụ, maxPointWidth/rectWidth > maxPointHeight/rectHeight) sử dụng:

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

khác, nếu chiều cao là sử dụng hạn chế hơn:

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

Không thể điền hình chữ nhật hoàn toàn.

Nói ở một kích thước phông chữ nhất định bạn có hai dòng văn bản, cả hai đều làm đầy màn hình theo chiều ngang, nhưng theo chiều dọc bạn có gần như không phải là ba dòng không gian.

Nếu bạn tăng kích thước phông chữ chỉ một chút xíu, thì các dòng không phù hợp nữa, vì vậy bạn cần ba dòng, nhưng ba dòng không phù hợp theo chiều dọc.

Vì vậy, bạn không có lựa chọn nào khác ngoài sống với khoảng trống theo chiều dọc.

Các vấn đề liên quan