2010-01-02 16 views
11

¿Cómo obtengo el tamaño de un NSString como si dibujara en un NSRect? El problema es cuando intento - [NSString sizeWithAttributes:], devuelve un NSSize como si tuviera un ancho infinito. Quiero dar un ancho máximo al método. ¿Hay alguna forma de hacerlo? (Por cierto: Mac OS, no iPhone OS)NSString sizeWithAttributes: content rect

Gracias, Alex

Respuesta

18
float heightForStringDrawing(NSString *myString, NSFont *myFont, 
     float myWidth) 
{ 
NSTextStorage *textStorage = [[[NSTextStorage alloc] initWithString:myString] autorelease]; 
NSTextContainer *textContainer = [[[NSTextContainer alloc] initWithContainerSize:NSMakeSize(myWidth, FLT_MAX)] autorelease]; 
; 
     NSLayoutManager *layoutManager = [[[NSLayoutManager alloc] init] autorelease]; 
[layoutManager addTextContainer:textContainer]; 
[textStorage addLayoutManager:layoutManager]; 
[textStorage addAttribute:NSFontAttributeName value:myFont 
     range:NSMakeRange(0, [textStorage length])]; 
[textContainer setLineFragmentPadding:0.0]; 

(void) [layoutManager glyphRangeForTextContainer:textContainer]; 
return [layoutManager 
    usedRectForTextContainer:textContainer].size.height; 
} 

Estaba en los documentos después de todo. Gracias Joshua de todos modos!

1

creo que su única opción aquí es NSLayoutManager y pidiendo una unión de las rectas utilizadas para una serie de glifos dado.

6

Revisé Alexandre Cassagne's answer para iOS con ARC habilitado.

CGSize ACMStringSize(NSString *string, UIFont *font, CGSize size) 
{ 
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithString:string]; 
    [textStorage addAttribute:NSFontAttributeName value:font range:NSMakeRange(0, [textStorage length])]; 
    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init]; 
    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:size]; 
    textContainer.lineFragmentPadding = 0; 
    [layoutManager addTextContainer:textContainer]; 
    [textStorage addLayoutManager:layoutManager]; 
    return [layoutManager usedRectForTextContainer:textContainer].size; 
}