Подтвердить что ты не робот

Что такое размер точки UIFont?

Я изо всех сил пытаюсь понять, что означает размер точки в UIFont. Это не пиксели, и это не является стандартным определением точки, которое связано с тем, что они относятся к 1/72-м дюймам.

Я разработал размер пикселя с помощью -[NSString sizeWithFont:] шрифтов разных размеров и получил следующее:

| Point Size | Pixel Size |
| ---------- | ---------- |
| 10.0       | 13.0       |
| 20.0       | 24.0       |
| 30.0       | 36.0       |
| 40.0       | 47.0       |
| 50.0       | 59.0       |
| 72.0       | 84.0       |
| 99.0       | 115.0      |
| 100.0      | 116.0      |

(я сделал [@"A" sizeWithFont:[UIFont systemFontOfSize:theSize]])

И глядя на размер точки 72.0, который не является 1-дюймовым, поскольку это находится на устройстве с DPI 163, поэтому 1-дюймовый будет 163,0 пикселей, правда?

Может ли кто-нибудь объяснить, что означает "точка" в терминах UIFont? то есть мой метод выше неправильно, и действительно, если бы я использовал что-то еще, я бы увидел, что что-то о шрифте составляет 163 пикселя в 72 точке? Или это чисто, что точка определяется из чего-то еще?

4b9b3361

Ответ 1

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

В 72.0 балла квадрат единицы шрифта - один дюйм. Glyph x шрифта y имеет произвольный размер по отношению к этому квадрату дюйма. Таким образом, дизайнер шрифтов может сделать шрифт, который кажется большим или малым по отношению к другим шрифтам. Это часть символа шрифта.

Итак, рисунок "A" в 72 точках говорит вам, что он будет в два раза выше, чем "A", нарисованный в 36 точках в одном и том же шрифте, и абсолютно ничего больше о том, каков фактический размер растрового изображения.

т.е. для данного шрифта единственный способ определить связь между размером точки и пикселями - это ее измерение.

Ответ 2

Я не уверен, как -[NSString sizeWithFont:] измеряет высоту. Использует ли она высоту линии или разницу между пиками безьеров? Какой текст вы использовали?

Я считаю, что -[UIFont lineHeight] было бы лучше измерить высоту.

Изменить: Также обратите внимание, что ни один из методов измерения не возвращает размер в пикселях. Он возвращает размер в points. Вы должны умножить результат на [UIScreen mainScreen].scale.

Обратите внимание на разницу между typographic points, используемой при построении шрифта, и points от iOS default logical coordinate space. К сожалению, эта разница не очень четко объясняется в документации.

Ответ 3

Сначала я подумал, не связано ли это с тем, как [пиксели CSS определены с шагом 96 на дюйм] [1], тогда как точки макета пользовательского интерфейса определяются на 72 дюйма на дюйм. (Где, конечно, "дюйм" не имеет ничего общего с физическим дюймом.) Почему веб-стандарты влияют на бизнес UIKit? Ну, вы можете заметить, что при проверке трассировок стека в отчетах отладчика или сбоев есть некоторый код WebKit, лежащий в основе большого количества UIKit, даже если вы не используете UIWebView. На самом деле, это проще.

Во-первых, размер шрифта измеряется от самого низкого счетчика до самого высокого уровня в обычном латинском тексте - например, от нижней части "j" до вершины "k", или для удобства измерения в одном символе, высота "ƒ". (Что U + 0192 "LATIN SMALL LETTER F WITH HOOK", легко набирается с помощью опции-F на американской клавиатуре Mac. Люди использовали его для сокращения "папки" назад, когда.) Вы заметите, что, измеряя эту схему, высота в пикселях (на дисплее 1x) соответствует указанному размеру шрифта - например, с [UIFont systemFontOfSize:14], "ƒ" будет иметь высоту 14 пикселей. (Измерение капитала "A" учитывает только произвольную часть пространства, измеренную в размере шрифта. Эта часть может меняться при меньших размерах шрифта: при рендеринге векторов шрифтов в пикселях "намек" изменяет результаты для получения более четкого экранного текста.)

Однако шрифты содержат всевозможные глифы, которые не вписываются в пространство, определенное этой метрикой. Будут буквы с диакритикой над восходящим потоком на восточно-европейских языках, а все виды знаков препинания и специальных символов, которые вписываются в "макет" намного больше. (См. Раздел "Математические символы" в окне "Специальные символы Mac OS X" для большого количества примеров.)

В CGSize, возвращаемом -[NSString sizeWithFont:], ширина учитывает конкретные символы в строке, но высота отражает только количество строк. Высота строки - это метрика, заданная шрифтом, и связанная с "макетом", охватывающая самые большие символы шрифта.

Ответ 4

Я согласен, что это очень запутанно. Я пытаюсь дать вам некоторые основные объяснения здесь, чтобы сделать вещи более ясными.

Во-первых, DPI (точка-дюйм) вещь происходит от печати на физических бумагах. Значит, и шрифт. Пункт устройства был изобретен, чтобы описать размер физической печати текста, только потому, что дюйм слишком велик для обычных размеров текста. Затем люди придумали точку, то есть длину 1/72 дюйма (фактически развитую в истории), чтобы легко описать размер текста. Так что да, если вы пишете документ в Word или другом программном обеспечении для текстовой обработки для печати, вы получите текст размером в один дюйм, если вы используете шрифт 72pt.

Во-вторых, теоретическая высота текста обычно отличается от визуализированных штрихов, которые вы можете увидеть своими глазами. Первоначальная идея высоты текста исходила из фактических глифов, используемых для печати. Все буквы выгравированы на глифных блоках, которые имеют одну и ту же высоту, которая соответствует высоте точки шрифта. Однако, в зависимости от разных букв и дизайна шрифтов, фактическая видимая часть текста может немного короче теоретической высоты. Helvetica Neue на самом деле очень стандартная. Если вы измеряете верхнюю часть буквы "k" в нижней части буквы "p", она будет соответствовать высоте шрифта.

В-третьих, компьютерный дисплей прикручивает DPI, а также определение точки в одно и то же время. Разрешение компьютерных дисплеев описывается их собственными пикселями, такими как 1024 x 768 или 1920 x 1080. Программное обеспечение фактически не заботится о физических размерах ваших мониторов, потому что все будет очень нечетким, если они масштабируют содержимое экрана, например, на бумаге - только физическое разрешение недостаточно высоко, чтобы сделать все гладким и законным. Программное обеспечение использует очень простой и мертвый способ: фиксированный DPI для любого используемого вами монитора. Для Windows это 96DPI; для Mac это 72DPI. Тем не менее, независимо от того, сколько пикселей составляет дюйм на вашем мониторе, программное обеспечение просто игнорирует его. Когда операционная система отображает текст в 72pt, он всегда будет на 96 пикселей выше в Windows и 72px выше на Mac. (Для чего документы Microsoft Word всегда выглядят меньше на Mac, и вам обычно нужно увеличить до 125%.)

Наконец, на iOS, он очень похож, независимо от того, iPhone, iPod touch, iPad или Apple Watch, iOS использует фиксированный 72DPI для экрана без сетчатки, 144DPI для отображения сетчатки @2x и 216DPI для отображения сетчатки @3x на iPhone 6 Plus.

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

Ответ 5

Истина, насколько я мог констатировать, заключается в том, что ложь UIFont. Все UIKit принимают вольности со шрифтами. Если вам нужна правда, вам нужно использовать CoreText, но во многих случаях это будет медленнее! (Так что в случае вашей таблицы высоты пикселей я думаю, что она добавляет какой-то коэффициент + bx, где x - размер точки.

Так почему это так? Скорость! UIKit округляет материал и создает скрипты с интервалом, чтобы он мог кэшировать растровые изображения. Или, по крайней мере, это было моим уходом!