2010-01-02 21 views
11

NSString'in boyutunu bir NSRect'te çizilmiş gibi nasıl edinebilirim? Sorun denediğimde - [NSString sizeWithAttributes:], NSSize sonsuz genişlikliymiş gibi döner. Yönteme maksimum genişlik vermek istiyorum. Bunu yapmanın bir yolu var mı? (BTW: Mac OS, değil iPhone OS)NSString boyutuWithAttributes: content rect

sayesinde Alex

cevap

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

Sonuçta dokümanlardaydı. Zaten Joshua'ya teşekkürler!

1

burada tek seçenek NSLayoutManager olan ve belirli bir kabartma aralığı için kullanılan rects birliği soran inanıyoruz.

6

iOS için ARC etkinleştirilmiş Alexandre Cassagne's answer'u gözden geçirdim.

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