Пользовательский установленный шрифт не отображается правильно в UILabel

Я пытаюсь использовать шрифт Helvetica Neue Condensed, который я получил из пакета Adobe Font Collection Pro. К сожалению, это выглядит неправильно, когда я использую его в UILabel.

Высота строки, кажется, правильно вычисляется (я думаю), но когда шрифт отображается, он выравнивается по самой верхней части ограничивающей рамки. Я назвал [myLabel sizeToFit] и только отрегулировал ширину, чтобы произвести этот захват экрана:

Screen capture of incorrect font rendering

У меня была такая же проблема как с жирным шрифтом, так и с обычной версией шрифта. Я смог вытащить версию Helvetica Neue Bold из OSX и поместить ее на свое устройство, и она отображает прекрасный (зеленый фон на картинке выше).

Что может быть неправильным с файлом шрифта или с моим кодом, который заставит его рисовать таким образом?

Ответ 1

Я разместил решение, которое включает в себя исправление файла шрифта ttf здесь:

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

Здесь решение, которое работало на мой пользовательский шрифт, который имел такую ​​же проблему в UILabel, UIButton и тому подобное. Проблема с шрифтом оказалась фактом, что его свойство ascender было слишком мало по сравнению со значением системных шрифтов. Ascender является вертикальным пробелом над символами шрифта. Чтобы исправить шрифт, вам придется загрузить утилиты командной строки Apple Font Tool Suite. Затем возьмите свой шрифт и выполните следующие действия:

~$ ftxdumperfuser -t hhea -A d Bold.ttf

Это создаст Bold.hhea.xml. Откройте его с помощью текстового редактора и увеличьте значение атрибута ascender. Вам придется немного поэкспериментировать, чтобы узнать точное значение, которое лучше всего подходит для вас. В моем случае я изменил его с 750 до 1200. Затем снова запустите утилиту со следующей командной строкой, чтобы объединить ваши изменения обратно в файл ttf:

~$ ftxdumperfuser -t hhea -A f Bold.ttf

Затем просто используйте полученный ttf-шрифт в своем приложении.

Ответ 2

Итак, это модифицированная версия ответа Колючего.

Я открыл свой шрифт с Glyphs, а затем экспортировал его, не изменяя ничего. Каким-то образом, волшебно, проблема вертикального выравнивания исчезла!

Что нового в том, что новый шрифт отлично работает с такими методами, как sizeWithFont:, поэтому у него нет проблем, упомянутых Joshua.

Я посмотрел таблицу HHEA с упомянутой командой колючий и заметил, что символы меняют не только ascender, но также lineGap и numberOfHMetrics для меня.

Здесь исходные данные перед:

versionMajor="1"
versionMinor="0"
ascender="780"
descender="-220"
lineGap="200"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="751"

и после:

versionMajor="1"
versionMinor="0"
ascender="980"
descender="-220"
lineGap="0"
advanceWidthMax="1371"
minLeftSideBearing="-73"
minRightSideBearing="-52"
xMaxExtent="1343"
caretSlopeRise="1"
caretSlopeRun="0"
caretOffset="0"
metricDataFormat="0"
numberOfHMetrics="748"

Итак, мораль истории - не просто увеличивайте рост, но и изменяйте другие связанные значения.

Я не специалист по типографии, поэтому я не могу объяснить, почему и как. Если кто-то может дать лучшее объяснение, это будет очень полезно!:)

Ответ 3

iOS 6 отличит свойство fontGap, а iOS 7 игнорирует его. Таким образом, только пользовательские шрифты с разрывом в строке 0 будут корректно работать в обеих операционных системах.

Решение состоит в том, чтобы сделать lineGap 0 и сделать зазор соответственно большим. В ответе выше, одним из решений является импорт и экспорт из Glyphs. Однако обратите внимание, что будущая версия приложения может исправить эту "ошибку".

Более надежное решение - отредактировать шрифт самостоятельно, за это post. В частности,

  • Установите OS X Font Tools.
  • Даммет метрики шрифтов в файл: ftxdumperfuser -t hhea -A d YOUR_FONT.ttf
  • Откройте сложенный файл в редакторе.
  • Отредактируйте свойство ascender, добавив к нему значение свойства lineGap. Например, если lineGap равно 200, а ascender - 750, сделайте ascender 950.
  • Установите lineGap в 0.
  • Объединить изменения в шрифт: ftxdumperfuser -t hhea -A f YOUR_FONT.ttf

Как только вы это сделаете, вам, возможно, придется соответствующим образом настроить свой интерфейс.

Ответ 4

  • Загрузите и установите Apple Font Tools здесь: https://developer.apple.com/downloads/index.action?q=font (ссылка для загрузки находится внизу)
  • Откройте терминал и cd, чтобы ваш шрифт был
  • Запустите эту команду: ftxdumperfuser -t hhea -A d MY_FONT_NAME.ttf
  • Теперь у вас есть xml файл с некоторыми свойствами шрифта, отредактируйте его в текстовом редакторе
  • Найдите свойство "lineGap" и добавьте 200 к его значению
  • Сохранить XML файл
  • Запустите эту команду: ftxdumperfuser -t hhea -A f MY_FONT_NAME.ttf
  • Удалить файл xml
  • Попробуйте сконфигурированный шрифт на iOS 6 и посмотрите, выглядит ли он лучше.
  • Если вам нужно, вы можете вернуться к шагу 3 и добавить/вычесть свойство "lineGap". (Я закончил добавление 250 к моей конфигурации).

Ответ 5

У нас была такая же проблема с одним из наших пользовательских шрифтов. Мы также "исправили" проблему, отредактировав свойство ascender шрифта. Однако мы обнаружили, что это создало другие проблемы и проблемы с компоновкой. Например, динамическая установка высоты ячеек на основе высоты надписи будет взорваться при использовании нашего шрифта, отредактированного поджатием.

В результате мы изменили свойство UIButton contentEdgetInsets.

yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);

Не уверен, какой метод лучше, но просто хотел поделиться другим способом устранения проблемы.

Ответ 6

Благодаря этому ответу я исправил свою проблему с помощью Glyphs, но немного по-другому.

Я открыл свой шрифт с помощью Glyphs (также работает с Glyphs mini) и нашел этот раздел там (это от Glyphs mini, чтобы попасть туда нажмите кнопку я в правом верхнем углу):

enter image description here

Просто удалите все эти зоны выравнивания (или некоторые из них), и это устранит эту проблему. Работала отлично для меня.

Ответ 7

Для тех, кто работает с OS X El Capitan и подходит к этой теме, вы могли заметить, что Apple Font Tool Suite больше не совместим (по крайней мере пока).

Но вы все равно можете выполнить изменения, описанные колючим и Джозефом Лином с бесплатным программным обеспечением для редактирования шрифтов FontForge.

Откройте шрифт с помощью FontForge и выберите "Элемент" в верхнем меню, затем перейдите в "Информация о шрифте" > "OS/2" > "Метрики". Там вы хотите отредактировать значения HHEad Line Gap и HHead Ascent Offset.

После того, как вы сделали необходимые изменения, вы можете просто экспортировать шрифт в File > Generate Fonts и выбрать правильный формат шрифта

Ответ 8

Вы пробовали Основной текст? У меня был некоторый успех, создавая пользовательские шрифты через Core Text, но я не знаю, соответствует ли это вашей ситуации.

Ответ 9

Если у вас возникли проблемы с этими утилит командной строки, попробуйте fontcreator на окне. и сменить редактор шрифтов из меню настроек.

Ответ 10

У меня была аналогичная проблема со знаковым шрифтом "FontAwesome" в моей игре Sprite Kit. Установка свойства SKLabelNode SKLabelVerticalAlignmentMode для .Center работала для меня.

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

Просто хотел поделиться тем, что кто-то будет бороться с той же проблемой.