Пользовательский установленный шрифт неправильно отображается в UILabel - PullRequest
79 голосов
/ 24 марта 2011

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

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

Screen capture of incorrect font rendering

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

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

Ответы [ 11 ]

121 голосов
/ 29 ноября 2011

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

Вот решение, которое работало для моего нестандартного шрифта, который имел ту же проблему в 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 в вашем приложении.

64 голосов
/ 28 мая 2013

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

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

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

Я посмотрел на таблицу HHEA с упомянутой командой kolyuchiy и заметил, что глифы изменили не только 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"

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

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

31 голосов
/ 24 октября 2013

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

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

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

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

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

4 голосов
/ 11 ноября 2015

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

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

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

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

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

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

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

enter image description here

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

3 голосов
/ 22 апреля 2013

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

В итоге мы изменили свойство UIButton contentEdgetInsets.

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

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

1 голос
/ 26 июня 2011

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

0 голосов
/ 19 ноября 2018

Создание атрибутивного текста из текста ваших ярлыков было для меня исправлением. Вот расширение:

extension UILabel {
    /// You can call with or without param values; without will use default 2.0
    func setLineSpacing(lineSpacing: CGFloat = 2.0, lineHeightMultiple: CGFloat = 2.0) {
        guard let labelText = self.text else { return }
        let paragraphStyle = NSMutableParagraphStyle()
        paragraphStyle.lineSpacing = lineSpacing
        paragraphStyle.lineHeightMultiple = lineHeightMultiple
        let attributedString:NSMutableAttributedString
        if let labelattributedText = self.attributedText {
            attributedString = NSMutableAttributedString(attributedString: labelattributedText)
        } else {
            attributedString = NSMutableAttributedString(string: labelText)
        }
        // (Swift 4.2 and above) Line spacing attribute
        attributedString.addAttribute(NSAttributedString.Key.paragraphStyle, value:paragraphStyle, range:NSMakeRange(0, attributedString.length))
        self.attributedText = attributedString
    }
}

Для моего собственного шрифта я получил нужный результат:

self.myLabel.setLineSpacing(lineSpacing: 1.2, lineHeightMultiple: 1.2)

Это работает с использованием нативного NSMutableParagraphStyle(), который содержит свойства высоты строки и расстояния (которые доступны как @IBOutlet свойства в раскадровке, если вы не программируете свои метки).

0 голосов
/ 20 июля 2015

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

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

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

...