2016-04-18 19 views
0

Ich möchte eine Zeichenfolge in einer einzigen Zeile auf einer UIView zeichnen, die die Breite der angegebenen Rect (ähnlich wie adjustsFontSizeToFitWidth für eine UILabel tut, wenn die Anzahl der Zeilen = 1) passt. Ich versuche, die Schriftgröße zu berechnen, die wie unten angegeben in die richtige Größe passt.Wie berechnet man die Schriftgröße für einen bestimmten NSString, die genau auf die richtige Breite passt, wenn sie in einer Ansicht gezeichnet wird?

- (UIFont *)fontforWidth:(CGFloat)width String:(NSString *)stringToFit { 

    CGFloat widthForIdealFontSize = [self widthForIdealFontSizeWithString:stringToFit]; 
    CGFloat requiredFontSize = (KIdealFontSize/widthForIdealFontSize*width); 

    return [UIFont fontWithName:self.fontName size:(requiredFontSize)]; 
    } 

    - (CGFloat)widthForIdealFontSizeWithString:(NSString *)inputString   { 

    NSAttributedString *attrString = [[NSAttributedString alloc]initWithString:inputString attributes:@{NSFontAttributeName:[UIFont fontWithName:self.fontName size:KIdealFontSize]}]; 
    CTLineRef line = CTLineCreateWithAttributedString((__bridge CFAttributedStringRef)attrString); 

    CGFloat ascent, descent, leading; 
    CGFloat width = CTLineGetTypographicBounds(line, &ascent, &descent, &leading); 
    return width; 

    } 

wo #define KIdealFontSize 1000. Ich nicht in der Lage bin, den genauen Wert der Schriftgröße für einige Schriftarten wie Zapfino, wo die Zeichenfolge abgeschnitten wird, wenn gezogen zu bekommen. Gibt es eine bessere Möglichkeit, die genaue Schriftgröße zu berechnen, die für alle Schriftarten die Breite passt?

Antwort

0

ich habe indirekte Lösung für diese

- (NSString *) calculateNUmberOFCharacters:(NSString *)orignalString size:(CGSize)size andFont:(UIFont *)font { 

float oneLineHeight = [self getHeightForText:@"Test" withFont:font andWidth:size.width]; 

NSString *outputString = @""; 
if (orignalString.length) { 

    if ([self getHeightForText:orignalString withFont:font andWidth:size.width] > oneLineHeight) { 

     NSArray *arrValues = [orignalString componentsSeparatedByString:@" "]; 
     __block NSString *oldString; 
     for (NSString *obj in arrValues) { 
      oldString = outputString; 
      outputString = [outputString stringByAppendingString:[NSString stringWithFormat:@"%@ ",obj]]; 

      if ([self getHeightForText:outputString withFont:font andWidth:size.width] > oneLineHeight) { 
       NSLog(@"%@",oldString); 
       return oldString; 
      } 
     } 
    } 
    return orignalString; 
} 
return nil; 

} 

Fahren Sie mit String, Breite und Schriftart es wird Sie String

entspricht Ihre ursprüngliche Zeichenfolge mit dem Wert zurück, die

zurück, wenn Spiel Sie dann bekommen Ihre Zeichenfolge entspricht dieser Breite sonst passieren mit Ereignis kleine Schriftarten darin

es ist ein langer Prozess, aber funktioniert

-(float) getHeightForText:(NSString*) text withFont:(UIFont*) font andWidth:(float) width{ 
CGSize constraint = CGSizeMake(width , 20000.0f); 
CGSize title_size; 
float totalHeight; 
title_size = [text boundingRectWithSize:constraint 
           options:NSStringDrawingUsesLineFragmentOrigin 
          attributes:@{ NSFontAttributeName : font } 
           context:nil].size; 

totalHeight = ceil(title_size.height); 

CGFloat height = MAX(totalHeight, 10.0f); 

return height; 

}