NSString sizeWithAttributes: Неточность - PullRequest
5 голосов
/ 13 марта 2010

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

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

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

Что даст мне 33,293457. Так что это около 5 пикселей от реальной ширины ..

Ответы [ 2 ]

7 голосов
/ 10 ноября 2010

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

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

Итак, ~ 5 пикселей, которые вы заметили, на самом деле ровно 6. Как только вы учтете это заполнение, у вас больше не будет проблем.

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

0 голосов
/ 13 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...