Вертикальное выравнивание пользовательского шрифта UIButton

118

У меня есть UIButtonпользовательский шрифт, который устанавливается при загрузке моего представления:

- (void)viewDidLoad
{
    [super viewDidLoad];    
    self.searchButton.titleLabel.font = [UIFont fontWithName: @"FONTNAME" size: 15.0 ];
}

У меня проблема в том, что шрифт кажется всплывающим над центральной линией. Если я закомментирую эту строку, шрифт по умолчанию будет хорошо центрирован по вертикали. Но переход на собственный шрифт нарушает вертикальное выравнивание.

У меня такая же проблема с ячейкой таблицы с настраиваемым шрифтом.

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

РЕДАКТИРОВАТЬ: я только что понял, что шрифт, который я использую, является шрифтом Windows TrueType. Я могу использовать его в TextEdit на Mac, только проблема с выравниванием в моем приложении

Текст кнопки не центрирован по вертикали

Пит
источник
У меня такая же проблема с этим шрифтом (.otf, а не .ttf): fontsquirrel.com/fonts/bebas-neue
Нил Эхардт

Ответы:

312

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

Вот решение, которое сработало для моего пользовательского шрифта, у которого была такая же проблема в UILabel, UIButton и т. Д. Проблема со шрифтом оказалась в том, что его свойство восходящего элемента было слишком маленьким по сравнению со значением системных шрифтов. Восходящий элемент - это вертикальный пробел над символами шрифта. Чтобы исправить ваш шрифт, вам нужно будет загрузить утилиты командной строки 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 в своем приложении.

OS X Эль Капитан

Установщик Apple Font Tool Suite больше не работает в OSX El Capitan из-за SIP, потому что он пытается установить двоичные файлы в защищенный каталог. Приходится извлекать вручную ftxdumperfuser. Сначала скопируйте pkg из dmg в локальный каталог, затем распакуйте его OS X Font Tools.pkgс помощью

~$ xar -xf OS\ X\ Font\ Tools.pkg

Теперь перейдите в папку fontTools.pkgс

~$ cd fontTools.pkg/

Извлечь полезную нагрузку с помощью

~$ cat Payload | gunzip -dc | cpio -i

Теперь ftxdumperfuserдвоичный файл находится в вашей текущей папке. Вы можете переместить его, чтобы /usr/local/bin/использовать его в каждой папке внутри терминального приложения, со следующими параметрами.

~$ mv ftxdumperfuser /usr/local/bin/
kolyuchiy
источник
4
+1 Отличный совет! Вот некоторая информация о восходящих
элементах
35
Работал одинаково хорошо для файлов OTF.
mharper
2
Если вы используете настраиваемый шрифт, измененный с помощью этого решения, и вы устанавливаете текст, например, в UITextView с несколькими строками, межстрочное расстояние становится слишком большим.
Чувак
5
Я обнаружил, что в iOS 7 beta 6 исправлена ​​проблема с выравниванием шрифтов. Так что, если вы сделаете это исправление, оно будет хорошо в iOS 6, но сломано в iOS 7 .... 7 все еще находится в
стадии
3
Инструменты шрифтов были обновлены для Xcode 9, они отлично устанавливаются на High Sierra. Прямая ссылка: developer.apple.com/download/more/?=font
Andrés Pizá Bückmann
49

Решил проблему корректировкой вставки верхнего содержимого (а не заголовка!).

Например: button.contentEdgeInsets = UIEdgeInsetsMake (10.0, 0.0, 0.0, 0.0);

Удачи!

Хорди Короминас
источник
15
Для меня это было хорошее быстрое решение, которое казалось проще, чем пытаться редактировать шрифт. myButton.titleLabel.font = [UIFont fontWithName: @ Размер "FontName": 20.0]; myButton.contentEdgeInsets = UIEdgeInsetsMake (3.0, 0.0, 0.0, 0.0);
Джейми Хэмик,
Brilliant! Спасибо! Моя проблема была немного другой, у меня были простые кнопки + и -, использующие шрифт по умолчанию, и они выглядели ниже, чем по центру, я смог использовать решение здесь, чтобы немного приподнять текст, чтобы он не выглядел.
Патрик Т. Нельсон
7

Не уверен, что это поможет, так как это может зависеть от вашего шрифта, но возможно, что ваша базовая линия смещена.

self.searchButton.titleLabel.baselineAdjustment = 
    UIBaselineAdjustmentAlignCenters;
Коврики
источник
3
Отлично работает с titleLabel для UIButton, когда размер шрифта корректируется с помощью minimumScaleFactor
smitt04
6

Думаю, это лучший ответ. не играйте с восходящим элементом, numberOfHMetrics и т. д. просто импортируйте-экспортом с помощью приложения Glyphs и работа выполнена. Благодаря этому ответу: https://stackoverflow.com/a/16798036/1207684

dollar2048
источник
Ты спас мне день!
Aleš Oskar Kocur
Мой тоже! Спасибо, сэр.
Хуан Сагасти
2

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

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

Как видите, попытка сделать это в IB имеет свои преимущества.

Шрикар Аппалараджу
источник
1
Этот параметр уже установлен, и в IB шрифт отображается вертикально, но отображается как шрифт по умолчанию. Только когда я запускаю свое приложение, появляется мой пользовательский шрифт, и он не центрирован по вертикали,
Пит,
вы устанавливаете свой "собственный шрифт" в IB? поддерживается ли оно в шрифтах iOS?
Srikar Appalaraju,
Шрифт установлен в IB, а также по коду, указанному в моем исходном посте. На самом деле он не отображается в макете экрана IB, хотя он отображается в раскрывающемся списке выбора шрифта в IB.
Пит,
2

Поздно к вечеринке, но поскольку эта проблема поразила меня в N-й раз, я подумал, что опубликую самое простое решение, которое я нашел: использование Python FontTools .

  1. Установите Python 3, если он недоступен в вашей системе.

  2. Установить FontTools

    pip3 install fonttools

    FontTools включает инструмент TTX, который позволяет конвертировать в XML и обратно.

  3. Преобразуйте свой шрифт в .ttx в той же папке

    ttx myFontFile.otf

  4. Внесите необходимые изменения в .ttx и удалите файл .otf, так как он будет заменен на следующем шаге.

  5. Конвертируйте файл обратно в .otf

    ttx myFontFile.ttx


Мотивация: решение по kolyuchi является неполным, и даже с этим расширенным потоком установки , работает ftxdumperfuserв результате ошибки на 10.15.2 Каталине.

Nifi
источник