NSString sizeWithAttributes: content rect

Как получить размер NSString, как если бы он нарисовал NSRect. Проблема в том, что когда я пытаюсь - [NSString sizeWithAttributes:], он возвращает NSSize, как если бы он имел бесконечную ширину. Я хочу дать максимальную ширину методу. Есть ли способ сделать это? (BTW: Mac OS, а не iPhone OS)

Спасибо, Alex

Ответ 1

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

В конце концов, это было в документах. Спасибо, Джошуа, в любом случае!

Ответ 2

Я пересмотрел ответ Александра Кассана для iOS с включенным ARC.

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

Ответ 3

Я считаю, что ваш единственный вариант здесь - NSLayoutManager и запрос на объединение используемых прямоугольников для данного диапазона глифов.