Я пытаюсь использовать шрифт Helvetica Neue Condensed, который я получил из пакета Adobe Font Collection Pro Package. К сожалению, он отображается неправильно, когда я использую его в UILabel
.
Кажется, что высота строки рассчитана правильно (я думаю), но когда шрифт отображается, он выравнивается по самому верху ограничительной рамки. Я позвонил [myLabel sizeToFit]
и только настроил ширину, чтобы сделать снимок экрана:
У меня была такая же проблема как с жирной, так и с обычной версией шрифта. Мне удалось вытащить версию Helvetica Neue Bold из OSX и установить ее на свое устройство, и она отображается нормально (зеленый фон на рисунке выше).
Что могло быть не так с файлом шрифта или моим кодом, из-за которого он рисовался таким образом?
Ответы:
Я опубликовал решение, которое включает исправление файла шрифта ttf здесь :
Вот решение, которое сработало для моего пользовательского шрифта, у которого была такая же проблема в 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 в своем приложении.
источник
Итак, это модифицированная версия ответа Колючего .
Я открыл свой шрифт с помощью Glyphs , а затем экспортировал его, ничего не меняя. Каким-то волшебным образом проблема с вертикальным выравниванием исчезла!
Что лучше, так это то, что новый шрифт прекрасно сочетается с такими методами, как
sizeWithFont:
, например , и не имеет проблем, упомянутых Джошуа .Я взглянул на таблицу HHEA с упомянутой командой kolyuchiy и заметил, что Glyphs модифицировали не только the
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"
Итак, мораль истории - не просто увеличивать восходящую, но и изменять другие связанные ценности.
Я не специалист по типографике, поэтому не могу объяснить, почему и как. Если кто-нибудь может дать лучшее объяснение, мы будем очень признательны! :)
источник
iOS 6 учитывает свойство шрифта lineGap, а iOS 7 игнорирует его. Таким образом, только пользовательские шрифты с нулевым интервалом между строками будут корректно работать в обеих операционных системах.
Решение состоит в том, чтобы сделать lineGap 0 и соответственно увеличить зажим для зажима. За ответ выше , одним из решений является импорт и экспорт из Glyphs. Однако обратите внимание, что будущая версия приложения может исправить эту «ошибку».
Более надежное решение - отредактировать шрифт самостоятельно, согласно этому сообщению . В частности,
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
Как только вы это сделаете, вам, возможно, придется соответствующим образом настроить свой пользовательский интерфейс.
источник
У нас была такая же проблема с одним из наших пользовательских шрифтов. Мы также «исправили» проблему, отредактировав свойство font ascender. Однако мы обнаружили, что это создало другие проблемы и проблемы с компоновкой. Например, динамическая установка высоты ячейки на основе высоты метки взорвется при использовании шрифта, отредактированного с помощью восходящего элемента.
В итоге мы изменили свойство UIButton contentEdgetInsets.
yourButton.contentEdgeInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
Не уверен, какой метод лучше, но просто хотел поделиться другим способом решения проблемы.
источник
источник
Те, кто использует OS X El Capitan и заходят в эту ветку, могут заметить, что Apple Font Tool Suite больше не совместим (по крайней мере, на данный момент).
Но вы по-прежнему можете вносить изменения, описанные Колючим и Джозефом Линь, с помощью бесплатной программы для редактирования шрифтов FontForge. .
Откройте шрифт с помощью FontForge и выберите «Элемент» в верхнем меню, затем перейдите в «Информация о шрифте»> «OS / 2»> «Метрики». Здесь вы хотите отредактировать значения HHEad Line Gap и HHead Ascent Offset.
После того, как вы внесете необходимые изменения, вы можете просто экспортировать шрифт в File> Generate Fonts и выбрать правильный формат шрифта.
источник
Благодаря этому ответу я решил проблему с символами, но немного по-другому.
Я открыл свой шрифт с помощью Glyphs (также работает с Glyphs mini) и нашел там этот раздел (это из Glyphs mini, чтобы попасть туда, нажмите кнопку i в правом верхнем углу):
Просто удалите все эти зоны выравнивания (или некоторые из них), и это решит эту проблему. У меня отлично сработало.
источник
Создание текста с атрибутами из текста ваших ярлыков было для меня решением. Вот расширение:
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
свойства в раскадровке, если вы не программируете свои метки).источник
Вы пробовали Core Text ? У меня были некоторые успехи в рендеринге пользовательских шрифтов через Core Text, но я не знаю, подойдет ли это к вашей ситуации.
источник
Я использовал https://github.com/fonttools/fonttools - очень простой в использовании и бесплатный. В моем случае изменение 'ascender' = 1000 и 'lineGap' = 0 в таблице 'hhea' помогло.
На основе статьи Тревора Хармона https://medium.com/@thetrevorharmon/how-to-use-apples-font-tools-to-tweak-a-font-a386600255ae
источник
Если у вас возникли проблемы с этими утилитами командной строки, попробуйте fontcreator в окне. и измените шрифт assender в его меню настроек.
источник
Для тех, кто изо всех сил пытается использовать
ftxdumperfuser
( колючий ответ) в Mac OS Mojave из-за ошибки command not found:export PATH="$PATH:$HOME/font-tools/FontCommandLineTools.pkg/Payload"
) или скопировать утилиты в папку bin.источник
У меня была аналогичная проблема с культовым шрифтом «FontAwesome» в моей игре Sprite Kit. Установка для свойства SKLabelNode SKLabelVerticalAlignmentMode значения .Center сработала для меня.
myLabel.verticalAlignmentMode = SKLabelVerticalAlignmentMode.Center
Просто хотел поделиться на случай, если кто-то будет бороться с той же проблемой.
источник