Вопрос по ios, fonts, uikit, objective-c, uifont – Каков точечный размер UIFont?

48

Я изо всех сил пытаюсь понять, что именно размер точки в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 точках? Или это просто, что точка определяется чем-то другим?

Да, и если вы прочитаете, что вы поймете, почему я ожидал, что значение 72 в моей таблице выше составит 163 пикселя. Но это не так, этоway выкл. mattjgalloway
Вы уже проверяли это:stackoverflow.com/questions/1059101/font-size-in-pixels ? tiguero
CRITICAL ... stackoverflow.com/a/38315462/294884 Fattie
Я не следую вашему аргументу; только потому, что вы измеряете размер в пикселях буквы "A" использование 72-точечного шрифта просто показывает, что он займет примерно полдюйма. Вы, кажется, предполагаете, что буква «A» должен занять дюйм экрана. trojanfoe
Высота в пикселях отsizeWithFont: включает в себя по возрастанию и по убыванию, так что это высота всей строки в пикселях. Кроме того, мой вопрос остается открытым - какова связь между размером точки и чем-то реальным. Еще раз обратите внимание, что точка и размер пикселя, похоже, никак не связаны между собой. mattjgalloway

Ваш Ответ

5   ответов
0

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

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

11

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

При 72,0 точках единичный квадрат шрифта составляет один дюйм. глифx шрифтаy имеет произвольный размер по отношению к этому квадратному дюйму. Таким образом, дизайнер шрифтов может создать шрифт, который кажется большим или маленьким по сравнению с другими шрифтами. Это часть шрифта 's' персонажа '.

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

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

Я до сих пор не совсем понимаю, что вы имеете в виду. Вы говорите, 72 точки / дюйм не имеет ничего общего с высотой линии, но чтоdoes 72 точки / дюйм относятся к тому? Кроме того, обратите внимание на значение для 99,0 - вы ожидаете, что оно будет близко к значению в 10 точках, умноженному на 10 по вашему объяснению, но оно далеко. mattjgalloway
Infact я добавил один для 100,0 балла, и это также далеко от размера в 10 баллов, умноженных на 10. mattjgalloway
Все хорошие объяснения, но не то, что я вижу. Обратите внимание, что размер точки удвоения не удваивает размер пикселя, что противоречит тому, что вы говорите. Кроме того, измеренный размер - это высота всей линии от того, что я вижу, и я предположил, что 1 дюйм относится к 72 точкам на 1 дюйм? То, что я измеряю, составляет ~ 0,5 дюйма при 72 точках шрифта на iPhone. mattjgalloway
Если что-то неясно, пожалуйста, дайте мне знать, но нет - 72 точки / дюйм не имеет ничего общего с высотой линии, кроме как относительно, как я пытался объяснить. Также с учетом сглаживания (+ -2 пикселя) (помните, что это удваивается размер векторных иллюстраций), ваша таблица показывает, что размер точки удвоения удваивает размер пикселя. Я не понимаю, как вы интерпретируете это по-другому.
Как я уже сказал, 72 точки / дюйм относятся к преобразованию внутренней системы координат шрифтов. В 72 точках 1 единица шрифта (система координат шрифта не имеет имени) равна 72 точкам. Важным моментом является то, что нет способа перейти от этой информации (я знаю, что одна единица шрифта будет составлять 72 точки) к знанию, каким будет размер пикселя глифа - это полностью зависит от шрифта. Вы пробовали разные шрифты? Попробуйте Женеву и Курьера.
3

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

Сначала размер шрифта измеряется от самого низкого до самого высокого.in regular Latin text - например, снизу от "j" на вершину «k» или, для удобства, в одном символе, высота «& # x192;». (Это U + 0192 «LATIN SMALL LETTER F WITH HOOK», легко набираемый с помощью option-F на клавиатуре Mac в США. Люди использовали его, чтобы сокращать «папку» еще когда.) Вы заметите это при измерении с этой схемой высота в пикселях (на дисплее 1x) соответствует указанному размеру шрифта - например, с[UIFont systemFontOf,Size:14], & quot; & # x192; & quot; будет 14 пикселей в высоту. (Измерение заглавной буквы «A» учитывает только произвольную часть пространства, измеренного в размере шрифта. Эта часть может изменяться при меньших размерах шрифта; при рендеринге векторов шрифта в пикселях «подсказка» изменяет результаты, чтобы сделать их более разборчивыми) текст на экране.)

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

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

Спасибо за этот пост; Вы можете быть заинтересованы в этом вопросе ..stackoverflow.com/questions/38203209/… @rickster
Ок, отличное объяснение. Но я до сих пор не совсем понимаю, что такое "точка" в терминах UIFont. Какая часть какого размера шрифта будет измерять определенный размер, когда на экране? Мне нравится идея о & # x192; хоть. Я буду играть с этим! mattjgalloway
Я пробовалƒ в точке 72,0, и она не была высотой 72,0 пикселя. Это просто магическое число в 14, где оно работает, а затем оно расходится? Все еще напрашивается вопрос - «в чем суть». mattjgalloway
Точка как относится кUIFont такой же, как точка для в других местах в геометрии UIKit. То, как он соответствует отображаемому тексту, является переменной. & Quot; Размер точки & quot; шрифта устанавливает ограничивающую высоту, которая обычно связана с высотой по возрастанию и высоте глифов (и поддиапазоном общей высоты строки, некоторые из которых могут использоваться другими символами). Тем не мение,font designers can do whatever they want within that geometry, поэтому размер глифа может не соответствовать размеру точки, а высота строки всегда будет (и должна, в пределах данного шрифта, постоянно) немного превышать размер точки.
2

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

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

Во-вторых, теоретическая высота текста обычно отличается от отрисованных штрихов, которые вы можете увидеть своими глазами. Исходная идея высоты текста возникла из фактических глифов, используемых для печати. Все буквы выгравированы на глифоблоках одинаковой высоты & # x2013; которая соответствует высоте шрифта. Однако, в зависимости от разных букв и разного дизайна шрифта, фактическая видимая часть текста может быть немного короче теоретической высоты. Helvetica Neue на самом деле очень стандартная. Если вы измеряете верхнюю часть буквы & quot; k & quot; внизу буквы «p» будет соответствовать высоте шрифта.

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

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

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

5

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

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

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

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

Странные точки = & gt; пикселей моих результатов, кажется, примерноpixels = ROUND((1 + points) * (115 / 99)). mattjgalloway
Вы правы, я проверяю это, и это совершенно странно.
@mattjgalloway Отредактировал ответ. Есть две разные единицы, обе называютсяpoint.
Но это тоже не правильно? Я знаю о точках против пикселей с точки зрения масштаба экрана, это очень отличается. Обратите внимание на мою таблицу результатов - соотношение стремится к 1.16, глядя на результаты, насколько я понял. Кажется странным соотношение. mattjgalloway
lineHeight также в очках, поэтому, к сожалению, не имеет отношения к вопросу. Я использовал текст@"A", Но помните, что это также не имеет отношения к вопросу. mattjgalloway

Похожие вопросы