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

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

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

Снимок экрана с неправильным отображением шрифта

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

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

75 голосов | спросил MikeQ 24 MaramThu, 24 Mar 2011 07:22:59 +03002011-03-24T07:22:59+03:0007 2011, 07:22:59

11 ответов


0

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

ответил kolyuchiy 29 22011vEurope/Moscow11bEurope/MoscowTue, 29 Nov 2011 20:33:59 +0400 2011, 20:33:59
0

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

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

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

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

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

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

ответил Joseph Lin 28 Maypm13 2013, 21:28:39
0

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

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

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

  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

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

ответил phatmann 24 +04002013-10-24T02:55:49+04:00312013bEurope/MoscowThu, 24 Oct 2013 02:55:49 +0400 2013, 02:55:49
0
  1. Загрузите и установите инструменты шрифтов Apple здесь: https://developer.apple. com /downloads /index.action? q = шрифт (ссылка на скачивание внизу)
  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. Удалить XML-файл
  9. Попробуйте настроить шрифт на iOS 6 и посмотрите, выглядит ли он лучше.
  10. Если вам нужно, вы можете вернуться к шагу 3 и добавить /вычесть свойство "lineGap". (Я добавил 250 к своей конфигурации)
ответил nurxyz 30 +04002013-10-30T01:20:51+04:00312013bEurope/MoscowWed, 30 Oct 2013 01:20:51 +0400 2013, 01:20:51
0

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

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

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

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

ответил Naiko 11 32015vEurope/Moscow11bEurope/MoscowWed, 11 Nov 2015 18:59:28 +0300 2015, 18:59:28
0

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

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

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

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

ответил Joshua Dance 22 PMpMon, 22 Apr 2013 22:07:42 +040007Monday 2013, 22:07:42
0

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

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

введите описание изображения здесь

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

ответил DevilPinky 22 J0000006Europe/Moscow 2015, 00:43:57
0

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

ответил RyanR 26 J0000006Europe/Moscow 2011, 07:29:51
0

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

ответил Gaurav 27 J000000Friday12 2012, 10:15:16
0

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

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 в раскадровке, если вы не программируете свои метки).

ответил App Dev Guy 19 12018vEurope/Moscow11bEurope/MoscowMon, 19 Nov 2018 11:18:24 +0300 2018, 11:18:24
0

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

myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center

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

ответил requig 20 J000000Monday15 2015, 08:40:22

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132