2010-03-13 2 views
5

Я хочу знать ширину NSString, отображаемую на экране в пикселях. Поэтому я могу соответствовать NSTextField своим границам, чтобы быть точно самой длиной самой строки. Поэтому я использовал «Label» для NSTextField и для тех, кто не знает, что я имею в виду, я получил ярлык с надписью «Label», шрифт «Lucida Grande 13px», не подбираемый, не редактируемый, обычный размер, без фона и в соответствии с для IB ширина составляет 38 пикселей.NSString sizeWithAttributes: Неточность

Если я хочу, чтобы получить его ширину программно я использую

[@"Label" sizeWithAttributes: [NSDictionary dictionaryWithObject: [NSFont fontWithName: @"Lucida Grande" size: 13] forKey: NSFontAttributeName]].width 

Который даст мне 33.293457. Таким образом, это около 5 пикселей реальной ширины.

ответ

0

Это действительно звучит разумно. Вы сравниваете две разные ширины; ширина исходной строки по отношению к ширине строки, содержащейся в NSTextField. Сложная строка, вероятно, имеет только немного бит с отступом на обоих концах, среди других незначительных различий.

+0

Может быть, но высота правильная с 6 цифрами после запятой ... После выполнения некоторых тестов это выглядит так, что результат всегда равен ~ 5 px меньше оригинала .. Вот почему я подозреваю, что что-то не так с атрибутами и я не знаю, что. Даже передача правильного цвета, фонового стиля, стиля абзаца, режима разрыва строки и направления дает мне те же результаты размером ~ 5 px меньше. – Jef

7

Я считаю, что вы заметили разницу между кадром элемента управления и его макетом. См. Frame vs Layout Frame за хорошее объяснение.

Вы делаете правильную вещь при вычислении ширины. Для ярлыка в верхней или нижней части элемента управления нет дополнительной прокладки, поэтому у вас не было проблем с высотой вашего контроля. Однако слева и справа от элемента управления есть еще три пикселя. Это можно проверить, просмотрев рамку и макет элемента управления Label в IB.

Таким образом, вы заметили, что 5 пикселей на самом деле ровно 6. После того, как вы учтете это дополнение, у вас не должно быть никаких проблем.

К сожалению, нет никакого API для определения того, что заполняется для различных элементов управления (кнопки Push имеют дополнительные 6 пикселей с каждой стороны). Я бы предложил подать отчет об ошибке в http://bugreport.apple.com. Apple действительно основывает те API, которые они предоставляют частично на количество запросов для них. В то время как IB скажет вам, вам нужно будет скопировать эти значения самостоятельно. Если они меняются в следующей версии ОС, вам необходимо будет обновить приложение.