2010-01-02 16 views
11

Come ottengo le dimensioni di NSString come se si disegnasse in un NSRect. Il problema è quando provo - [NSString sizeWithAttributes:], restituisce un NSSize come se avesse una larghezza infinita. Voglio dare una larghezza massima al metodo. C'è un modo per farlo? (BTW: Mac OS, non iPhone OS)Dimensione NSStringWithAttributes: contenuto rect

Grazie, Alex

risposta

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

Dopotutto era nella documentazione. Grazie comunque a Joshua!

1

credo l'unica opzione qui è NSLayoutManager e chiedendo un unione dei rettangoli utilizzati per un determinato intervallo di glifi.

6

Ho modificato Alexandre Cassagne's answer per iOS con ARC attivato.

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; 
} 
Problemi correlati