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 и запрос на объединение используемых прямоугольников для данного диапазона глифов.