UIKit [NSString sizeWithFont: constrainedToSize:] в AppKit - PullRequest
6 голосов
/ 17 февраля 2011

Есть ли в AppKit какой-либо эквивалентный метод (для Какао в Mac OS X), который делает то же самое, что и [NSString sizeWithFont:constrainedToSize:]?

в UIKit.визуализировать конкретную строку, ограниченную шириной / высотой?

Обновление: ниже приведен фрагмент кода, который я использую и который, как я ожидаю, даст результаты, которые я получу.

NSDictionary *attributes = [NSDictionary dictionaryWithObjectsAndKeys:
                            [NSFont systemFontOfSize: [NSFont smallSystemFontSize]], NSFontAttributeName,
                            [NSParagraphStyle defaultParagraphStyle], NSParagraphStyleAttributeName,
                            nil];
NSSize size = NSMakeSize(200.0, MAXFLOAT);
NSRect bounds;

bounds = [@"This is a really really really really really really really long string that won't fit on one line"
             boundingRectWithSize: size
             options: NSStringDrawingUsesFontLeading
             attributes: attributes];

NSLog(@"height: %02f, width: %02f", bounds.size.height, bounds.size.width);

Я ожидал бы, что ширина вывода будет 200, а высота будет чем-то большим, чем высота отдельной строки, однако это выдает:

height: 14.000000, width: 466.619141

Спасибо!

Ответы [ 6 ]

13 голосов
/ 15 января 2012

Попробуйте это:

bounds = [value boundingRectWithSize:size options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin attributes:attributes];
6 голосов
/ 04 марта 2011

Более новый API категории NSExtendedStringDrawing (методы с аргументом NSStringDrawingOptions) ведет себя в однострочном режиме. Если вы хотите измерить / визуализировать в многострочном режиме, укажите NSStringDrawingUsesLineFragmentOrigin.

1 голос
/ 13 декабря 2013

Вот более полный пример того, как вы можете сделать это с помощью boundingRectWithSize.

// get the text field
NSTextField* field = (NSTextField*)view;

// create the new font for the text field
NSFont* newFont = [NSFont fontWithName:@"Trebuchet MS" size:11.0];

// set the font on the text field
[field setFont:newFont];

// calculate the size the textfield needs to be in order to display the text properly
NSString* text      = field.stringValue;
NSInteger maxWidth  = field.frame.size.width;
NSInteger maxHeight = 20000;
CGSize constraint   = CGSizeMake(maxWidth, maxHeight);
NSDictionary* attrs = [NSDictionary dictionaryWithObjectsAndKeys:NSFontAttributeName,newFont, nil];
NSRect newBounds    = [text boundingRectWithSize:constraint
                                         options:NSLineBreakByWordWrapping | NSStringDrawingUsesLineFragmentOrigin
                                      attributes:attrs];

// set the size of the text field to the calculated size
field.frame = NSMakeRect(field.frame.origin.x, field.frame.origin.y, field.frame.size.width, newBounds.size.height);

Конечно, для получения дополнительной информации посмотрите документацию Apple:

1 голос
/ 18 февраля 2011

РЕДАКТИРОВАТЬ: Вы должны быть в состоянии сделать вещи в Lion и позже.Описанные ниже проблемы были исправлены.


Невозможно точно измерить текст среди текущих API Mac OS X.

Есть несколько API, которые обещают работать, но нет.Это один из них; Функция Core Text для этой цели - другая.Некоторые методы возвращают результаты, которые близки, но неверны;некоторые возвращают результаты, которые, кажется, ничего не значат вообще.Я еще не сообщал об этих ошибках, но когда я это сделаю, я отредактирую числа радаров в этом ответе.Вы должны также подать ошибку и включить свой код в небольшой пример проекта.

[Очевидно, я уже подал основной текст: 8666756. Он закрыт как дубликат неуказанной другой ошибки.Что касается Какао, я подал 9022238 о методе, предложенном Дейвом, и завтра подам две ошибки NSLayoutManager.]

Это самое близкое решение, которое я нашел.

1 голос
/ 17 февраля 2011

Если вы хотите ограничить строку определенным размером, вы используете -[NSString boundingRectWithSize:options:attributes:]..size возвращенного NSRect - это размер, который вы ищете.

0 голосов
/ 17 февраля 2011

Если вы ищете документацию по NSString, вы найдете «Справочник дополнений NSString Application Kit», который в значительной степени аналогичен аналогу UIKit.

-[NSString sizeWithAttributes:]

- это метод, который вы ищетедля.

...