2010-01-02 14 views
11

मैं एनएसएसटींग के आकार को कैसे प्राप्त करूं जैसे कि यह एक NSRect में खींचा गया हो। समस्या तब होती है जब मैं कोशिश करता हूं - [एनएसएसटींग आकार WithAttributes:], यह एक एनएसएसआईएस देता है जैसे कि इसकी अनंत चौड़ाई होती है। मैं विधि को अधिकतम चौड़ाई देना चाहता हूं। क्या ऐसा करने का कोई तरीका है? (BTW: मैक ओएस, नहीं iPhone OS)एनएसएसटींग आकार WithAttributes: सामग्री rect

धन्यवाद, एलेक्स

उत्तर

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

यह बाद में दस्तावेज़ों में था। वैसे भी यहोशू धन्यवाद!

1

मेरा मानना ​​है कि अपने ही यहाँ विकल्प NSLayoutManager है और किसी दिए गए ग्लिफ़ रेंज के लिए इस्तेमाल किया rects का एक संघ के लिए पूछ रहा।

6

मैंने एआरसी सक्षम के साथ आईओएस के लिए Alexandre Cassagne's answer संशोधित किया।

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